Python heapq模組官方文件翻譯

winston_DBA發表於2015-12-29
該模組實現了一個堆佇列的演算法或者優先順序佇列演算法的實現。
堆是一個任何父節點值都小於等於其子節點的值的二叉樹。該應用透過heap[k]<=heap[2*k+1]和heap[k]<=heap[2*k+2]陣列來實現,並且從0開始計算元素。為了方便比較,未定義的元素被認為是無窮大的。堆最有意思的屬性就是它最小的元素總是根節點,即heap[0]。
下面的API在兩個方面和文字堆演算法有區別:
a)我們使用從0開始的索引,這使得父節點和其子節點的索引變得更不會那麼明顯。但由於Python使用的就是基於0的索引,所以這很合適。
b)pop返回最小的值,而不是最大值。(堆佇列也被文字中稱為“最小堆”,而“最大堆”在文字中更加常見,因為他更加適用於就地排序(in-place sorting))

以上兩個區別使得堆看起來就行普通的Python列表:heap[0]為最小項和heap.sort()保持堆不變。

想要建立一個堆,可以透過一個空的列表[]或者透過heapify()函式來轉換一個非空列表。

堆提供了一下方法:
heapq.heappush(heap, item)
     給堆新增值,並保持堆不變。
heapq.heappop(heap)
     從堆中國返回最小值,並保持堆不變。如果堆為空,則丟擲IndexError錯誤。
     如果想要訪問堆中最小值,但是又不想彈出它,可透過heap[0]訪問。
heapq.heappushpop(heap, item)
     相當於分別執行heappush(heap, item)和heappop(heap),但是比分開執行更加高效。
heapq.heapify(x)
     轉換一個非空列表x,順序保持不變(in-place),轉換的時間和列表的長度線性相關。
heapq.heapreplace(heap, item)
     返回最小值並新增一個值,對的大小保持不變。如果堆是空的,將丟擲IndexError異常。
     該方法相當於heappop()和heappush()的組合,但是比分開執行更加高效,由於操作完成後堆長度沒有改變,其比較適用於固定大小的堆。
     需要注意的是,該方法返回的值有可能比新增的值更大,所以如果不希望發生這種情況,可以考慮heappushpop()方法,heappushpop()方法總是返回最小值,但保留更大的值在堆中。

heapq模組還提供了三個堆的一般方法:

heapq.merge(*iterable)
     將多個已排序的輸入合併成一個已排序的輸出(例如從多個日誌檔案里根據時間戳來合併),並返回一個基於排序值的迭代器。
     類似於sorted(itertools.chain(*iterables)) 但是返回的是迭代器,這樣避免一次性將所有資料載入到記憶體中,並且假定每個輸入都已經排過序。
heapq.nlargest(n, iterable[,key])
     從資料集中返回n個最大值,如果引數中包含key,則指定一個函式作為引數用於從迭代器中的每個元素獲取一個對比key:key=str.lower等價於sorted(iterable, key=key, reverse=True)[:n]
heapq.nsmallest(n, iterable[, key])
     和nsmallest相反,返回n個最小值

heapq.nlargest(n, iterable[, key])和heapq.nsmallest(n, iteralbe[, key])兩個函式當n值較小時,能夠提供很好的效能,當n值較大時,使用sorted()函式將會更加高效,當然,如果n==1的時候,使用內建的min()和max()函式將會更加高效。如果這些函式需要被重複使用,則可考慮將迭代器轉換成堆。

舉例說明:
例一、heapsort函式可以將值一次性推送到堆中,接著一次倒出一個值

>>> def heapsort(iterable):
...     h = []
...     for value in iterable:
...         heappush(h, value)
...     return [heappop(h) for i in range(len(h))]
...
>>> heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

上例和sorted(iterable)類似,但是和sorted()又不一樣,因為該實現不是穩定的。

例二、堆的元素可以是元組,當需要在記錄上分配對比值(例如任務優先順序)時,將會非常有用。

>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30167136/viewspace-1966758/,如需轉載,請註明出處,否則將追究法律責任。

相關文章