[英]Priority Queue - Binary Heap
我正在嘗試將優先級隊列實現為排序數組支持的最小二進制堆。 我試圖讓update_key函數在對數時間運行,但為了做到這一點,我必須知道數組中項目的位置。 無論如何不使用地圖這樣做? 如果是這樣,怎么樣? 謝謝
如果您真的希望能夠更改任意元素的鍵,則堆不是數據結構的最佳選擇。 它給你的是以下組合:
1.的另一個好處是缺少指針意味着你對malloc/free
( new/delete
)的調用少得多。 地圖(在標准庫中表示為平衡二叉樹)為您提供其中的兩個,添加
find()
。 因此,雖然您可以將另一個數據結構附加到堆中,將指針存儲在堆中,然后通過指針使比較運算符取消引用,但您很快就會發現自己在第一次使用map
時的時間和空間的復雜性地點。
您的查找鍵功能應在log(n)時間內運行。 您的更新(更改密鑰)應該是恆定的時間。 你的刪除功能應該在log(n)時間內運行。 你的插入函數應該是log(n)時間。
如果這些假設為真,請嘗試以下方法:1)在堆中找到您的項目(IE:二進制搜索,因為它是一個排序數組)。 2)更新你的密鑰(你只是改變一個值,恆定的時間)3)從堆日志中刪除項目(n)以重新密化。
4)將您的項目插入堆日志(n)。
所以,你有log(n)+ 1 + log(n)+ log(n),它減少到log(n)。
注意:這是分攤的,因為如果你必須重新分配你的數組等...這會增加開銷。 但無論如何你不應該經常這樣做。
這是數組支持堆的權衡:你獲得了極好的內存使用(良好的局部性和最小的開銷),但你忘記了元素。 要解決它,你必須添加一些開銷。
一個解決方案就是這樣。 堆包含C*
類型的對象。 C是一個帶有int
成員heap_index
的類,它是堆數組中對象的索引。 每當您在堆數組中移動元素時,您都必須更新其heap_index
以將其設置為新索引。
然后Update_key(以及刪除任意元素)是log(n)時間,因為它需要恆定的時間來查找元素(通過heap_index
),並且log(n)時間將其冒泡到正確的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.