有一個名爲treap的數據結構:這是一個隨機二叉搜索樹,它也是隨機生成的所謂「優先級」上的堆。帶有隱式鍵的Treap
這種結構存在變化,其中鍵是隱式的,它們不存儲在樹中,但我們將樹中節點的有序索引視爲此節點的鍵。我們需要在每個節點中存儲子樹的大小而不是密鑰。這種技術使我們能夠像某種數組一樣思考treap,它支持O(log N)時間內的大量操作:插入,刪除,子數組反轉,間隔變化等等。
我對這個結構有所瞭解,但沒有那麼多。我試圖谷歌它,但我發現只有很多關於treap本身的文章,但沒有關於這個「隱式treap」/「索引列表」。我甚至不知道它的名字,因爲我的母語不是英語,我聽過的講座使用了結構的本地術語,而不是英語的原始術語。這個本地術語可以直接用英語翻譯爲「隱式密鑰上的樹」或「隱式密鑰上的笛卡爾樹」。
任何人都可以在關於這個結構的文章中指出我的意思,或告訴我它的原名嗎?謝謝。
P.S.對不起,如果我的英語不夠理解。
UPD:關於我正在尋找的結構的一些額外解釋。
考慮一個通常的隨機選擇優先級和密鑰,它們是存儲在樹中的實際用戶數據。然後讓我們想象一下,在每個節點中都存儲有其他用戶信息,而鍵只不過是搜索鍵。下一步是計算並維護每個節點中的子樹大小:我們必須在每個合併/拆分/添加/刪除後更新此參數,但它允許我們在O(log N)中查找樹的第K個元素,時間。
當我們在每個節點中都有子樹大小時,我們可以丟棄密鑰並設想treap代表一個用戶數據在inorder遍歷中的數組。每個元素的數組索引可以通過子樹大小輕鬆計算。現在我們可以在數組中間添加/移除一個元素,或者分割這個數組 - 全部在O(log N)時間。
我們也可以進行「多重」操作 - 例如,爲我們的「數組」中的所有元素添加一個常數值。爲了實現這個,我們必須使這個操作延遲,在每個節點中添加一個參數,該參數表示一個延遲常量,該參數必須「稍後」添加到此節點的子陣列的所有元素中,並將變化「向上」推送爲必要。向子陣列添加常量或繪製(標記)子陣列可以以這種方式進行延遲,如顛倒子陣列(這裏位於「子陣列中的節點中的延遲信息必須顛倒」)等等。
UPD2:這是code snippet - 我找到的少量信息。不要注意西裏爾字母:)單詞「снеявнымключом」的意思是直接翻譯「隱含密鑰」。
我正在談論treap,而不是隨機BST。 正如我所看到的,treap有鍵和優先級:key是存儲在樹中的實際用戶數據,優先級是隨機選擇的內部參數。 Treap在鍵上是BST並且同時堆上優先級。 我是烏克蘭人,講座是俄語講師 - Vitaly Goldstein,ACM ICPC獎章獲得者,前谷歌實習生,目前在Yandex工作。如果你知道的話,在哈爾科夫冬季ACM編程學校聽過講座。 我會在我的帖子的UPD中分享關於這個結構的一些額外的解釋。 – Skiminok 2010-08-17 09:38:19
@Skiminok我對這項技術的寫作感興趣。請給我一個鏈接,如果你有它方便嗎?謝謝! – dhruvbird 2012-03-06 02:24:16
@dhruvbird在treasures和隨機BST上的原始文件是http://people.ischool.berkeley.edu/~aragon/pubs/rst96.pdf。但它只描述了基本的定義和操作。我已經在三篇文章的系列文章中涵蓋了所有關於treaps及其應用程序的材料(包括帶隱式鍵的treaps):[#1](http://habrahabr.ru/blogs/algorithm/101818/ ),[#2](http://habrahabr.ru/blogs/algorithm/102006/),[#3](http://habrahabr.ru/blogs/algorithm/102364/)。只有俄羅斯人,不幸。 – Skiminok 2012-03-07 20:54:49