http://docs.python.org/2/library/heapq.htmlhtml
heapq 是一個小堆(固然也能夠經過變換優先級的值 變成大堆)python
heapq 能夠 壓入 普通的整數 也能夠 壓入list 這樣就能 優先級 附帶其它屬性了htm
heapq 自己 支持 push 和 pop 操做隊列
可是如何 調整已經加入的元素的優先級值呢?get
好比 將某個元素的優先級 調小, 使其向堆頂移動, 這裏須要知道這個元素當前在堆的哪一個位置,接着 執行 堆調整的交換操做,調整這個元素的位置hash
首先如何查找到元素的位置,這個就比較頭痛,沒想到辦法讓heapq在調整優先級的過程當中同時記錄元素的位置,若是不能這樣快速的查找位置,那heapq就沒有意義了異常
所以只能採用另一種方式,相似於線性探測解決衝突的hash表所作的,將刪除的元素 標記 ID 爲-1 ,認爲其被刪除了, 在出隊操做中, 對於已經被刪除的元素則忽略, 接着將調整優先級的 新元素從新插入到隊列裏面去移動
可是存在一個問題, 這樣不能經過簡單的查看隊列長度來斷定隊列是否爲空, 須要封裝一個pop操做來拋出異常, 同時在調用pop的時候 注意 捕獲異常library