Python堆
堆是一種特殊的樹結構,其中每個父節點小於或等於其子節點。 然後它被稱爲最小堆(Min Heap
)。 如果每個父節點大於或等於其子節點,則稱它爲最大堆(Max Heap
)。 實施優先級隊列是非常有用的,在該隊列中,具有較高權重的隊列項目在處理中具有更高的優先級。在本章中,我們將學習使用python實現堆數據結構。
創建一個堆
堆是通過使用python內建的名稱爲heapq
的庫創建的。 該庫具有對堆數據結構進行各種操作的相關功能。 以下是這些函數的列表 -
-
heapify
- 此函數將常規列表轉換爲堆。 在結果堆中,最小的元素被推到索引位置0
。但是其餘的數據元素不一定被排序。 -
heappush
- 這個函數在堆中添加一個元素而不改變當前堆。 -
heappop
- 該函數返回堆中最小的數據元素。 -
heapreplace
- 該函數用函數中提供的新值替換最小的數據元素。
通過簡單地使用具有heapify
函數的元素列表來創建堆。 在下面的例子中,提供了一個元素列表,heapify
函數重新排列了元素到最初位置的元素。
import heapq
H = [21,1,45,78,3,5]
# Use heapify to rearrange the elements
heapq.heapify(H)
print(H)
執行上面示例代碼,得到以下結果 -
[1, 3, 5, 78, 21, 45]
插入堆
將數據元素插入堆總是在最後一個索引處添加元素。 但是,只有在值最小的情況下,纔可以再次應用heapify
函數將新添加的元素添加到第一個索引。 在下面的例子中,插入數字 - 8
。
import heapq
H = [21,1,45,78,3,5]
# Covert to a heap
heapq.heapify(H)
print(H)
# Add element
heapq.heappush(H,8)
print(H)
執行上面示例代碼,得到以下結果 -
[1, 3, 5, 78, 21, 45]
[1, 3, 5, 78, 21, 45, 8]
從堆中移除
可以使用此功能在第一個索引處移除元素。 在下面的例子中,函數將始終刪除索引位置1
處的元素。
import heapq
H = [21,1,45,78,3,5]
# Create the heap
heapq.heapify(H)
print(H)
# Remove element from the heap
heapq.heappop(H)
print(H)
執行上面示例代碼,得到以下結果 -
[1, 3, 5, 78, 21, 45]
[3, 21, 5, 78, 45]
替換堆
heapreplace
函數總是刪除堆中最小的元素,並在未被任何順序修復的地方插入新的傳入元素。參考以下示例 -
import heapq
H = [21,1,45,78,3,5]
# Create the heap
heapq.heapify(H)
print(H)
# Replace an element
heapq.heapreplace(H,6)
print(H)
執行上面示例代碼,得到以下結果 -
[1, 3, 5, 78, 21, 45]
[3, 6, 5, 78, 21, 45]