簡體   English   中英

如何從給定列表有效地構造B +樹?

[英]How to efficiently construct a B+ tree from a given list?

我想從給定大小為N的無序元素列表中構建B +樹。

我知道這樣做的最佳界限是Θ(N / B * logM / B(N / B))塊傳輸,這也是排序的最佳選擇; 所以我不能簡單地選擇一個項目並單獨在樹中插入,因為它會給我O(N logB(N))塊傳輸。

所以我認為構建樹的最佳方法是首先對元素進行排序,因為無論如何都要對樹進行排序。 從那以后,我很茫然。

我想過這樣的事情:

  1. 從列表中取出B元素
  2. 把它們寫在某個地方(這是三個葉子)
  3. 采取塊的最后一個元素(最大的); 它將是葉子父級的路由鍵
  4. 對下一個元素重復步驟1,直到父級中有B-1個路由鍵
  5. 當父母中有B-1路由鍵時,表示它已滿。 所以新的路由密鑰將改為“祖父”(因此樹增長一級),所有新的葉子將有一個新的父級
  6. 繼續這樣,直到讀取N/B塊為止

基本上,問題在於我沒有考慮內部節點可以擁有的最小子節點數。 因此,例如,一個節點最終只有一個子節點,這顯然是錯誤的。

我到處尋找,但我找不到實際解釋如何在Θ(N / B * logM / B(N / B))構建樹的算法。 我找到的只是在列表中為每個項目簡單插入樹的算法,而沒有利用B因子。

你能幫助我嗎,也許能指出我正確的方向?

而不是同時構建所有級別,可能使用多於一定數量的RAM塊,我認為我將構建最基本的級別(即,廣度優先而不是深度優先)。 給定列表,將其貪婪地切成大小為B的塊。如果只有一個塊,那就是根。 否則,如果最后一個塊的元素太少,則盡可能均勻地重新平衡其元素與第二個塊的元素; 兩者現在都有足夠的元素。 下一個列表由該級別的每個塊中的最后一個元素組成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM