heapq模組提供基於堆的優先排序演算法,內建模組位於./anaconda3/lib/heapq.py。
堆的邏輯結構就是完全二叉樹,並且二叉樹中父節點的值小於等於該節點的所有子節點的值。這種實現可以使用 heap[k] <= heap[2k+1] 並且 heap[k] <= heap[2k+2] (其中 k 為索引,從 0 開始計數)的形式體現,對於堆來說,最小元素即為根元素 heap[0]。
1.初始化
可以通過 list 對 heap 進行初始化,或者通過 api 中的 heapify 將已知的 list 轉化為 heap 物件。
2. heapq.py中提供的函式方法
heapq.heapify(x):以線性時間將乙個列表轉化為堆
heapq.merge(*iterables, key=none, reverse=false)
heapq.nlargest(n, iterable, key=none):返回可列舉物件中的 n 個最大值,並返回乙個結果集 list,key 為對該結果集的操作。
heapq.nsmallest(n, iterable, key=none):同上相反
栗子:
import heapq
defheapsort
(iterable):
h =
for i in iterable:
# method 1: sort to list
s = [3, 5, 1, 2, 4, 6, 0, 1]
print(heapsort(s))
'''[0, 1, 1, 2, 3, 4, 5, 6]
'''# method 2: use key to find price_min
portfolio = [,,,
,,
]cheap = heapq.nsmallest(1, portfolio, key=lambda s:s['price'])
print(cheap)'''
'''# method 3: use while to push min element
defheapilize_list
(x):
n = len(x)
# 獲取存在子節點的節點 index 列表,並對每個節點單元進行最小堆處理
for i in reversed(range(n // 2)):
raiseup_node(x, i)
defput_down_node
(heap, startpos, pos):
current_item = heap[pos]
# 判斷單元中最小子節點與父節點的大小
while pos > startpos:
parent_pos = (pos - 1) >> 1
parent_item = heap[parent_pos]
if current_item < parent_item:
heap[pos] = parent_item
pos = parent_pos
continue
break
heap[pos] = current_item
defraiseup_node
(heap, pos):
heap_len = len(heap)
start_pos = pos
current_item = heap[pos]
left_child_pos = pos * 2 + 1
while left_child_pos < heap_len:
right_child_pos = left_child_pos + 1
# 將這個單元中的最小子節點元素與父節點元素進行位置調換
if right_child_pos < heap_len and
not heap[left_child_pos] < heap[right_child_pos]:
left_child_pos = right_child_pos
heap[pos] = heap[left_child_pos]
pos = left_child_pos
left_child_pos = pos * 2 + 1
heap[pos] = current_item
put_down_node(heap, start_pos, pos)
p = [4, 6, 2, 10, 1]
heapilize_list(p)
print(p)
'''[1, 4, 2, 10, 6]
'''
Python中堆模組heapq
對於排序演算法有很多種,其中包括常見的 氣泡排序,選擇排序,插入排序,希爾排序,快速排序,歸併排序,堆排序 這裡主要講一下堆排序,可以採用自己的方式實現,也可以採用python內建模組heapq實現,現在分別從這兩種方法實現一下.1 自己實現 import math from collections...
Python堆排序內建模組heapq
挨個出數 合併獲取前n最大或最小的元素 實現優先佇列 其他方法 該模組提供了堆排序演算法的實現。堆是一顆特殊的完全二叉樹。小根堆 滿足任一節點都比其孩子節點小 大根堆 滿足任一節點都比其孩子節點大使用heap.heapify list 轉換列表成為堆結構 import heapq import ra...
Python 標準模組堆heapq詳解
import heapq nums 8,2,23,1,7,4,18,23,42,37,2 heapq.heapify 將list x 轉換成堆,原地,線性時間內。heapq.heapify nums print nums 將 item 的值加入 heap 中,保持堆的不變性。print nums 彈...