2016-04-26 55 views
1

我有一個簡單的堆定義爲列表的列表。我從heapq模塊中使用heapop模塊來提取具有最小密鑰(我知道它隱含地是內部列表的第一個元素)的列表。但在以下情況下,流行操作似乎給出了不尋常的結果。heappop的不尋常結果?

有人可以解釋爲什麼嗎?

堆= [[0,0,0],[INF,1,1],[INF,2,2],[5,3,3],[INF,4,4]]

heapq.heappop(堆)

[0,0,0]

heapq.heappop(堆)

[INF,1,1]

heapq.heappop(堆)

[5,3,3]

heapq.heappop(堆)

[INF,2,2]

heapq.heappop(堆)

[INF,4,4]

回答

4

的問題是,你正在使用的不是堆名單上heapq。 documentation討論了使用heapify命令,並且確實有效:

>>> import heapq 
>>> from numpy import inf 
>>> heap=[[0, 0, 0], [inf, 1, 1], [inf, 2, 2], [5, 3, 3], [inf, 4, 4]] 
>>> heapq.heapify(heap) 
>>> heap 
[[0, 0, 0], [5, 3, 3], [inf, 2, 2], [inf, 1, 1], [inf, 4, 4]] 
>>> heapq.heappop(heap) 
[0, 0, 0] 
>>> heapq.heappop(heap) 
[5, 3, 3] 
>>> heapq.heappop(heap) 
[inf, 1, 1] 
>>> heapq.heappop(heap) 
[inf, 2, 2] 
>>> heapq.heappop(heap) 
[inf, 4, 4] 
+0

如果我在執行某些操作時將inf修改爲某個值,該怎麼辦?我需要再次運行heapify嗎? – Janmajay

+0

如果你可能改變順序,那麼你將需要再次heapify。這不是魔術 - 它只是一個標準化的排序算法。一種選擇是將你想要更改的列表申請出來,然後在新列表中應用。如果要將列表保存爲堆,那麼只能使用heapq操作對其進行修改 –

+0

heapq.heapreplace是一個函數,它允許您同時執行pop和push操作 –