2010-12-10 54 views
0

可能重複:
How can I implement decrease-key functionality in Python's heapq?如何在O(lgn)中heapq heapq?

嗨,

我使用heapq在Python實現優先級隊列。隊列中的項目改變了他們的優先級,當發生這種情況時,我需要heapq heapify。
問題是,heapq只有heapify函數可以堆積整個堆,而不是heapify,從heap中的某個項目開始,知道其餘的已經是一個有序堆(像經典的CS文本堆heapify) 。
由於每個heapify調用是O(n)而不是O(lgn),所以差別很大。 是否可以在不使用標準列表實現堆的情況下完成?

謝謝!


看來,我的問題是How can I implement decrease-key functionality in Python's heapq?
答案重複出現表明有各地重新實現基於堆的隊列與特定項目的正確O(LGN)heapify沒有辦法。

+0

可能的重複http://stackoverflow.com/questions/1465662/how-can-i-implement-decrease-key-functionality-in-pythons-heapq – 2010-12-10 23:42:58

+0

是的,它是足夠接近(我不遞減,但原理是一樣的)。我想我會重新實現一堆...... – 2010-12-10 23:46:35

+0

或者只是按照Alex Martelli在他的回答結束時給出的建議。投票結束重複。 – 2010-12-10 23:56:37

回答

0

我可以通過使當前堆項目無效(在項目內部產生一個標記)並將相同的項目推送到堆(O(lgn))來避免heapify造成此問題。
這可能會給一些無效項目(我在pop()上進行清理)堆積充足,但是會避免用堆項目來重新實現堆,這些堆項意識到它們當前的堆位置以及基於heapify的新位置。