簡體   English   中英

基於迭代器構造提升優先級隊列

[英]construct boost priority queue based on iterators

我有一個binomial_heaps列表,並且算法的每次迭代都必須更新某些binomial_heaps中元素的優先級。 為此,我使用boost binomial_heap的更新功能。 但是,我必須完全刪除並重建binomial_heaps之一(因為所有優先級都會發生變化)。 而不是每次都使用push(如果我理解正確的話,它的復雜度為n * log(n)),我想基於基礎容器的迭代器(一種為線性時間的heapify或make_heap操作)構造它)。 在標准priority_queue中這似乎是可能的,但在boost實現中則不可能。 另一方面,標准版本沒有為我提供更新功能。 有沒有辦法解決這個問題,我可以同時擁有這兩者,或者另一個同時支持這兩者的庫。 也許我的推理是,將所有元素推送到空優先級隊列中比較慢,這是不正確的?

有人可能會說我需要重建整個優先級隊列這一事實有嚴重的錯誤,這將使優先級隊列的使用完全多余。 我要實現的算法是“通過Aaron Clauset在非常大的網絡中查找社區結構”,其中的作者確實做到了這一點(除非我沒有正確解釋它)

(抱歉,由於我沒有足夠的聲譽來發布兩個以上的鏈接,因此無法將鏈接發布到論文上)

Clauset等人的“快速模塊化”算法。 此處 紙,此處為 代碼 )使用一對鏈接的數據結構。 一方面,您有一個稀疏的矩陣數據結構(實際上只是一個鄰接表,在該表中,我們使用平衡的二叉樹數據結構存儲它們,而不是將懸掛在特定數組元素上的元素存儲為鏈接列表),和最大堆。 稀疏矩陣中的所有值(實際上是算法中潛在合並的dQ_ij值)也存儲在max-heap中。

因此,最大堆只是在稀疏矩陣中找到具有最大正值的邊的有效方法。 在具有該邊的ij對之后,您想要將列(行)i的元素“插入”到列(行)j的元素中,然后要刪除列(行)i。 因此,在每次從max-heap彈出之后,您都不會重建整個max-heap。 相反,您要從中刪除某些元素(從稀疏矩陣中刪除的行/列中的元素),並更新其他元素的值(對於j,則為更新的行/列中的元素)。

這是鏈接數據結構有用的地方-在原始實現中,稀疏矩陣中的每個元素在其最大堆中存儲一個指向其對應條目的指針,這樣,如果您更新稀疏矩陣中的值,則可以找到max-heap中的相應元素並更新其值。 完成此操作后,您需要通過讓更新的堆元素(遞歸)在堆中上下移動來重新堆集。 同樣,如果刪除稀疏矩陣中的元素,則可以在堆中找到它的條目並在其上調用delete函數。

暫無
暫無

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

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