簡體   English   中英

我們可以使用二叉搜索樹來模擬堆操作嗎?

[英]Can we use binary search tree to simulate heap operation?

我想知道我們是否可以使用二叉搜索樹來模擬堆操作(插入,找到最小值,刪除最小值),即使用BST來執行相同的工作?

這樣做有什么好處嗎?

我們當然可以。 但是有一個平衡的BST。

最小的是leftest元素。 最大值是最正確的元素。 在修改數據結構之后,找到這些元素的每一個都是O(logn) ,並且可以在每次插入/刪除時緩存[注意這里有優化的空間,但這種天真的方法也不會與復雜性要求相矛盾!]

這樣你得到插入,刪除: O(logn) ,findMin / findMax: O(1)

編輯:
我在這個實現中可以想到的唯一優勢是你可以在一個數據結構中同時獲得findMin,findMax。
但是,這個解決方案會慢得多[每步更多操作,預計會有更多緩存未命中...]並且比基於常規數組的堆實現消耗更多空間。

是的,但是你丟失了堆的O(1)平均插入

正如其他人提到的,您可以使用BST來模擬堆。

然而,這有一個主要的缺點:你失去了O(1)插入平均時間,這基本上是首先使用堆的唯一原因: https//stackoverflow.com/a/29548834/895245

如果要跟蹤堆上的最小值和最大值,我建議您使用兩個堆而不是BST來保持O(1)插入優勢。

基本上,我同意@amit的回答。 我將詳細介紹這個修改后的BST的實現。

堆可以在O(1)中執行findMin findMax ,但不能在同一數據結構中執行。 稍作修改,BST可以在O(1)中同時執行 findMin findMax

在此修改后的BST中,每次執行可能修改數據結構的操作時,都會跟蹤最小節點和最大節點。 例如,在插入操作中,您可以檢查最小值是否大於新插入的值,然后將最小值分配給新添加的節點。 可以對最大值應用相同的技術。 因此,此BST包含這些信息,您可以在O(1)中檢索它們。 (與二進制堆相同)

在此BST(特別是平衡BST)中,當您pop minpop max ,要分配的下一個最小值是最小節點的后繼值,而要分配的下一個最大值是最大節點的一個值。 因此它在O(1)中執行。 感謝下面的@JimMischel評論,但是我們需要重新平衡樹,因此它仍然會運行O(log n)。 (與二進制堆相同)

在我看來,一般Heap可以被Balanced BST取代,因為BST在幾乎所有的堆數據結構中都能表現得更好。 但是,我不確定Heap是否應被視為過時的數據結構。 (你怎么看?)

PS:必須交叉引用不同的問題: https//stackoverflow.com/a/27074221/764592

是的,我們可以通過簡單地插入並找到BST中的最小值。 然而,由於在整個樹中強制執行更嚴格的排序,因此查找將花費O(log n)時間並且其他函數接收類似的懲罰,因此幾乎沒有好處。

暫無
暫無

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

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