簡體   English   中英

優先級隊列 - 二進制堆

[英]Priority Queue - Binary Heap

我正在嘗試將優先級隊列實現為排序數組支持的最小二進制堆。 我試圖讓update_key函數在對數時間運行,但為了做到這一點,我必須知道數組中項目的位置。 無論如何不使用地圖這樣做? 如果是這樣,怎么樣? 謝謝

如果您真的希望能夠更改任意元素的鍵,則堆不是數據結構的最佳選擇。 它給你的是以下組合:

  1. 緊湊表示(沒有指針,只是一個數組和一個隱式索引方案)
  2. 對數插入,重新平衡
  3. 對數去除最小(最大)元素。
  4. O(1)訪問最小(最大)元素的值。 -

1.的另一個好處是缺少指針意味着你對malloc/freenew/delete )的調用少得多。 地圖(在標准庫中表示為平衡二叉樹)為您提供其中的兩個,添加

  1. 任何鍵上的對數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.

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