2010-08-16 26 views
10

有一個名爲treap的數據結構:這是一個隨機二叉搜索樹,它也是隨機生成的所謂「優先級」上的堆。帶有隱式鍵的Treap

這種結構存在變化,其中鍵是隱式的,它們不存儲在樹中,但我們將樹中節點的有序索引視爲此節點的鍵。我們需要在每個節點中存儲子樹的大小而不是密鑰。這種技術使我們能夠像某種數組一樣思考treap,它支持O(log N)時間內的大量操作:插入,刪除,子數組反轉,間隔變化等等。

我對這個結構有所瞭解,但沒有那麼多。我試圖谷歌它,但我發現只有很多關於treap本身的文章,但沒有關於這個「隱式treap」/「索引列表」。我甚至不知道它的名字,因爲我的母語不是英語,我聽過的講座使用了結構的本地術語,而不是英語的原始術語。這個本地術語可以直接用英語翻譯爲「隱式密鑰上的樹」或「隱式密鑰上的笛卡爾樹」。

任何人都可以在關於這個結構的文章中指出我的意思,或告訴我它的原名嗎?謝謝。

P.S.對不起,如果我的英語不夠理解。

UPD:關於我正在尋找的結構的一些額外解釋。

考慮一個通常的隨機選擇優先級和密鑰,它們是存儲在樹中的實際用戶數據。然後讓我們想象一下,在每個節點中都存儲有其他用戶信息,而鍵只不過是搜索鍵。下一步是計算並維護每個節點中的子樹大小:我們必須在每個合併/拆分/添加/刪除後更新此參數,但它允許我們在O(log N)中查找樹的第K個元素,時間。

當我們在每個節點中都有子樹大小時,我們可以丟棄密鑰並設想treap代表一個用戶數據在inorder遍歷中的數組。每個元素的數組索引可以通過子樹大小輕鬆計算。現在我們可以在數組中間添加/移除一個元素,或者分割這個數組 - 全部在O(log N)時間。

我們也可以進行「多重」操作 - 例如,爲我們的「數組」中的所有元素添加一個常數值。爲了實現這個,我們必須使這個操作延遲,在每個節點中添加一個參數,該參數表示一個延遲常量,該參數必須「稍後」添加到此節點的子陣列的所有元素中,並將變化「向上」推送爲必要。向子陣列添加常量或繪製(標記)子陣列可以以這種方式進行延遲,如顛倒子陣列(這裏位於「子陣列中的節點中的延遲信息必須顛倒」)等等。

UPD2:這是code snippet - 我找到的少量信息。不要注意西裏爾字母:)單詞「снеявнымключом」的意思是直接翻譯「隱含密鑰」。

回答

1

在treaps中的關鍵思想(沒有雙關意圖!)是使用密鑰,這是隨機的。如果你把鑰匙取下來,我看不出你有什麼樣的方法:所以也許我誤解了你的問題。或者您可能指的是trevert的替代方案,隨機二分搜索樹。兩種數據結構都使用相同的思想,通過確保您的樹看起來像平均樹(而不是病態),您可以獲得平均情況下的複雜性。

隨着treaps,你使用隨機優先級和平衡來做到這一點。

對於隨機二叉樹,隨機性僅在構造過程中被包含:也就是說,當您在樹T中插入節點時,其概率爲1 /(size(T)+ 1)爲根,其中大小(T)是T的節點數量;當然如果節點沒有插入到根目錄下,你將繼續遞歸直到它被添加。 (請參閱我的C.馬丁內斯關於這些樹的詳細研究的文章。)

此數據結構的行爲完全像treap,但使用不需要密鑰的不同機制。

如果這不是你正在尋找的東西,也許你可以分享一些額外的信息:你的講師是否提到過任何可能在這個結構上工作過的人,你在哪裏講這個講師以及他/你的國籍。它可能看起來不像,但知道你的母語可能是一個重要的線索,因爲你通常可以將算法/數據結構固定到源自它的特定國家。

+1

我正在談論treap,而不是隨機BST。 正如我所看到的,treap有鍵和優先級:key是存儲在樹中的實際用戶數據,優先級是隨機選擇的內部參數。 Treap在鍵上是BST並且同時堆上優先級。 我是烏克蘭人,講座是俄語講師 - Vitaly Goldstein,ACM ICPC獎章獲得者,前谷歌實習生,目前在Yandex工作。如果你知道的話,在哈爾科夫冬季ACM編程學校聽過講座。 我會在我的帖子的UPD中分享關於這個結構的一些額外的解釋。 – Skiminok 2010-08-17 09:38:19

+0

@Skiminok我對這項技術的寫作感興趣。請給我一個鏈接,如果你有它方便嗎?謝謝! – dhruvbird 2012-03-06 02:24:16

+1

@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

0

我不認爲這個數據結構有一個名稱,因爲它只是兩個正交概念的組合。你可以像這樣使用隱式鍵來處理任何自平衡樹數據結構。

您可能想看看替罪羊樹,因爲它們已經使用子樹大小進行重新平衡,並且不需要任何每個節點的開銷。

+0

我可以對任何自平衡樹進行合併和分割嗎?隱式樹允許在任何索引處拆分數組,或者刪除子數組,或者合併兩個數組 - 全部在O(log N)時間。是否適用於其他任何樹:合併/拆分數據結構與維護節點中的附加統計信息的可能性:子/數組的總和/最大/大小,延遲添加/繪製/更改/反轉/等等? – Skiminok 2010-08-19 16:40:43

1

也許您在尋找一種Rope(字符串的複雜形式),以適應您對延遲操作的需求。有趣的是,關於繩索right here right now有一個懸而未決的問題。