堆是一種特殊的樹結構,其中每個父節點小於或等於其子節點。 然後它被稱為最小堆(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]