Python標準庫 heapq 堆排序演算法

2021-07-09 03:36:12 字數 3157 閱讀 1169

[python標準庫]heapq——堆排序演算法

作用:headpq 模組實現了乙個適用於 python 列表的最小堆排序演算法。

python 版本:2.3 版本中新增,並在 2.5 版本中做了補充

堆(heap)是乙個樹形資料結構,其中子節點與父節點是一種有序關係。二叉堆(binary heap)可以使用如下方式組織的列表或陣列表示,即元素 n 的子元素位於 2*n+1 和 2*n+2(索引從 0 開始)。這種布局允許原地重新組織堆,從而不必在增加或刪除元素時分配大量記憶體。

最大堆(max-heap)確保父節點大於或等於其兩個子節點。最小堆(min-heap)要求父節點小於或等於其子節點。python 的 heapq 模組實現了乙個最小堆。

示例資料

示例將使用 heapq_heapdata.py 中的資料。

# this data was generated with the random module.

data = [19, 9, 4, 10, 11]

堆輸出使用 heapq_showtree.py 列印。

import math

from cstringio import stringio

def show_tree(tree, total_width=36, fill=' '):

"""pretty-print a tree."""

output = stringio()

last_row = -1

for i, n in enumerate(tree):

if i:

row = int(math.floor(math.log(i+1, 2)))

else:

row = 0

if row != last_row:

output.write('\n')

columns = 2**row

col_width = int(math.floor((total_width * 1.0) / columns))

output.write(str(n).center(col_width, fill))

last_row = row

print output.getvalue()

print '-' * total_width

print

return

建立堆

import heapq

from heapq_showtree import show_tree

from heapq_heapdata import data

heap =

print 'random :', data

print

for n in data:

print 'add %3d:' % n

show_tree(heap)

如果資料已經在記憶體中,使用 heapify() 原地重新組織列表中的元素會更高效。

import heapq

from heapq_showtree import show_tree

from heapq_heapdata import data

print 'random :', data

heapq.heapify(data)

print 'heapified :'

show_tree(data)

如果按堆排序一次乙個元素地構建列表,其結果與構建乙個無序列表再呼叫 heapify() 是一樣的。

訪問堆的內容

import heapq

from heapq_showtree import show_tree

from heapq_heapdata import data

print 'random :', data

heapq.heapify(data)

print 'heapified :'

show_tree(data)

print

for i in xrange(2):

print 'pop %3d:' % smallest

show_tree(data)

如果希望在乙個操作中刪除現有元素並替換為新值,可以使用 heapreplace()。

import heapq

from heapq_showtree import show_tree

from heapq_heapdata import data

heapq.heapify(data)

print 'start:'

show_tree(data)

for n in [0, 13]:

smallest = heapq.heapreplace(data, n)

print 'replace %2d with %2d:' % (smallest, n)

show_tree(data)

通過原地替換元素,這樣可以維持乙個固定大小的堆,如按優先順序排序的作業佇列。

堆的資料極值

heapq 還包括兩個檢查可迭代物件的函式,查詢其中包含的最大值或最小值的範圍。

import heapq

from heapq_heapdata import data

print 'all :', data

print '3 largest :', heapq.nlargest(3, data)

print 'from sort :', list(reversed(sorted(data)[-3:]))

print '3 smallest:', heapq.nsmallest(3, data)

print 'from sort :', sorted(data)[:3]

只有當 n 值(n>1)相對小時使用 nlargest() 和 nsmallest() 才算高效,不過有些情況下這兩個函式會很方便。

python標準庫 heapq堆佇列演算法

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

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

python 堆操作 heapq庫

這個模組 build in 實現了乙個堆的資料結構,完美的解決了top k問題,以後解決top k問題的時候,直接把這個模組拿來用就可以了 注意,預設的heap是乙個小頂堆!heapq模組提供了如下幾個函式 heapq.heapify x 將列表x進行堆調整,預設的是小頂堆 heapq.merge ...