5 4 heapq 堆佇列演算法

2021-07-09 11:57:55 字數 2933 閱讀 9967

本模組實現了堆佇列演算法,也叫作優先順序佇列演算法。堆佇列是一棵二叉樹,並且擁有這樣特點,它的父節點的值小於等於任何它的子節點的值,如果採用陣列array

實現,可以把它們的關係表示為:

heap[k] <= heap[2*k+1] 

和 heap[k] <= heap[2*k+2]

,對於所有

k值都成立,k值從

0開始計算。作為比較,可以認為不存的元素是無窮大的。堆佇列有乙個比較重要的特性,它的最小值的元素就是在根:

heap[0]

。下面的api

與教科書上堆演算法有兩點差別:

(a)使用

0開始的索引。這樣可能會讓大家看到節點層次的索引上有點彆扭的,但這樣更適合

python

語言處理,因為

python是以0

為開始計算陣列和列表的索引。

(b)彈出的方法返回的值是最小值,而不是最大值(在教科書上叫作最小堆,最大堆在教科書更通用地使用來教學,因為它更適合排序演算法)。基於上面兩點可以檢視乙個堆:

heap[0]

返回乙個最小值的項,

heap.sort()

對整個堆進行排序。

建立乙個堆佇列,可以使用乙個列表

,也可以使用

heapify(x)

函式。把一項值壓入堆heap

,同時維持堆的排序要求。

例子:#python 3.4

import heapq

h = 

結果輸出如下:

彈出並返回堆裡最小值的項,調整堆排序。如果堆為空,丟擲異常indexerror

。例子:

#python 3.4

import heapq

h = 

結果輸出如下:

向堆裡插入一項,並返回最小值的項。組合了前面兩個函式,這樣更加有效率。

例子:#python 3.4

import heapq

h = 

結果輸出如下:

heapq.heapify(x) 

就地轉換乙個列表為堆排序,時間為線性。

例子:#python 3.4

import heapq

h = [9, 8, 7, 6, 2, 4, 5]

heapq.heapify(h)

print(h)

結果輸出如下:

[2, 6, 4, 9, 8, 7, 5]

heapq.heapreplace(heap, item) 

彈出最小值的項,並返回相應的值,最後把新項壓入堆。如果堆為空丟擲異常indexerror

。例子:

#python 3.4

import heapq

h = [9, 8, 7, 6, 2, 4, 5]

heapq.heapify(h)

print(h)

print(heapq.heapreplace(h, 1))

print(h)

結果輸出如下:

[2, 6, 4, 9, 8, 7, 5]

[1, 6, 4, 9, 8, 7, 5]

heapq.merge(*iterables)

合併多個堆排序後的列表,返回乙個迭代器訪問所有值。

例子:#python 3.4

import heapq

h = [9, 8, 7, 6, 2, 4, 5]

heapq.heapify(h)

l = [19, 11, 3, 15, 16]

heapq.heapify(l)

for i in heapq.merge(h,l):

print(i, end = ',')

結果輸出如下:

2,3,6,4,9,8,7,5,11,19,15,16,

heapq.nlargest(n, iterable, key=none) 

從資料集iterable

裡獲取n

項最大值,以列表方式返回。如果引數 

key提供,

key是乙個比較函式,用來比較元素之間的值。

例子:#python 3.4

import heapq

h = [9, 1, 7, 6, 2, 4, 5]

l = heapq.nlargest(3, h)

print(l)

結果輸出如下:

[9, 7, 6]

heapq.nsmallest(n, iterable, key=none) 

從資料集iterable

裡獲取n

項最小值,以列表方式返回。如果引數 

key提供,

key是乙個比較函式,用來比較元素之間的值。相當於:

sorted(iterable, key=key)[:n]

例子:#python 3.4

import heapq

h = [9, 1, 7, 6, 2, 4, 5]

l = heapq.nsmallest(3, h)

print(l)

結果輸出如下:

[1, 2, 4]

在最後這兩個函式中,如果數量比較少時使用起來比較高效,如果資料量比較大,要使用sorted()

函式,如果

n=1最好使用內建函式

min()

或max()

。採用堆演算法來實現排序:

例子:#python 3.4

import heapq

def heapsort(iterable):

'實現與

sorted(iterable)

相同的功能

'h = 

for value in iterable:

print(heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0]))

結果輸出如下:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

python標準庫 heapq堆佇列演算法

這個模組提供了堆佇列演算法的實現,也稱為優先佇列演算法。這個模組最常用的操作是將乙個列表轉換為乙個堆,預設是小根堆 它的每個父節點的值都只會小於或所有孩子節點的值 而且常用的主要有三個方法 有的題目要求為大根堆這個時候在儲存的時候可以將某個元素儲存為負數,這樣相當於維護的是乙個大根堆 其餘的方法可以...

網易雷火筆試 優先佇列 heapq 堆

豬場周邊商場有n種不同的商品,第i種商品有g i件。現在需要組織一次買福袋的活動,每個福袋恰好有k件不同種類的商品,求最多能組成多少個福袋。輸入描述 第一行為2個正整數,表示商場共有n種不同商品,每個額福袋需要k種不同商品 第二行為n個正整數,表示商場每種商品的件數。輸出描述 福袋個數利用了優先佇列...

演算法 heapq模組優先佇列

heapq模組,優先佇列,小頂堆,最少值放在頂部,值越小,優先順序越高 heapq.heap 從堆中彈出最小的元素,並重新調整 heapq.heap,item 新增元素新增到堆中,不會調整 heap data 1,3,5,7,9,2,4,6,8,0 for item in data ordered ...