我需要實現一個B +樹。尋找B +樹的中位數
,我需要創建以下方法:
- 插入(X) - 0(log_t(X))。
- 搜索 - 成功搜索 - O(log_t(x))。不成功的搜索 - O(1){具有極高的可能罩}
於是我開始與執行插入(X) - 每次我有一個完整的葉子,我想它分裂成兩個獨立的樹葉。 一個鍵的鍵等於或低於中間鍵,第二個鍵包含鍵值高於中位數的鍵。
如何在不損害運行時間的情況下找到這個中值?
我想到:
- 每個內部節點的代表和樹葉爲較小的B +樹,但隨後的中值是根(或在根中的元素之一)僅當樹是完全平衡。
- 將每個內部節點和葉子表示爲一個雙向鏈表。並試圖在插入輸入時獲取中值密鑰,但輸入無法使用。
- 表示爲數組可能會給我中間,但是當我將它分開時,我需要至少O(n/2)將鍵插入到一個新數組中。
我該怎麼辦?
關於搜索,明智之見:成功搜索和不成功搜索之間的區別在於搜索樹葉,但我仍然需要通過樹的不同鍵「運行」以確定密鑰是否在那個樹。那麼它怎麼可能是O(1)?
這些值存儲在樹葉中。但是,如何在樹的內部節點中排序鍵? (不是葉子) – StationaryTraveller 2013-05-11 17:30:52
鑰匙也存放在樹葉中。將B +樹想象成一個集合或一個多集合,所有的密鑰都存儲在樹葉中。內部節點僅保留部分密鑰以導航到樹葉。請注意,集合中沒有任何關鍵字不存在於所有樹葉中(即當且僅當它存在於某棵樹的樹葉中時,該項目位於由B +樹表示的集合中)。 – amit 2013-05-11 23:33:20