Python中的heapq模組

2021-08-13 11:18:32 字數 2319 閱讀 1908

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 彈...