Python heapq模組官方文件翻譯
該模組實現了一個堆佇列的演算法或者優先順序佇列演算法的實現。
堆是一個任何父節點值都小於等於其子節點的值的二叉樹。該應用透過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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Moya官方文件翻譯
- docker官方文件翻譯3Docker
- docker官方文件翻譯4Docker
- rabbitmq 官方文件翻譯-2MQ
- docker官方文件翻譯5Docker
- docker官方文件翻譯2Docker
- docker官方文件翻譯1Docker
- Core Foundation 官方文件翻譯
- HTTPie 官方文件中文翻譯版HTTP
- BBNorm官方指導文件翻譯ORM
- [翻譯]ElasticSearch官方文件-簡介Elasticsearch
- Redis-py官方文件翻譯Redis
- Akka官方文件翻譯:Cluster Specification
- ReactiveCocoa 4 官方文件翻譯React
- ExoPlayer的使用與解析(官方文件翻譯)
- [翻譯]ElasticSearch官方文件-資料的修改Elasticsearch
- Matlab最新的官方文件中文翻譯Matlab
- [翻譯]ElasticSearch官方文件-查詢語言Elasticsearch
- 【Tomcat 6.0官方文件翻譯】—— 簡介Tomcat
- 別開心太早,Python 官方文件的翻譯差遠了Python
- python之排序操作及heapq模組Python排序
- 每週一個 Python 模組 | heapqPython
- 歡迎參與 KubeVela 官方文件翻譯活動
- kotlinx協程官方文件中文翻譯版本Kotlin
- Kotlin 官方參考文件翻譯完畢Kotlin
- TypeScript 官方手冊翻譯計劃【十三】:模組TypeScript
- voltDB官方文件第三章翻譯
- PendingIntent 是個啥?官方文件描述的很到位。我給翻譯翻譯Intent
- 文件翻譯器怎麼用?如何翻譯Word文件?
- logback官方文件中文翻譯第七章:FiltersFilter
- Retrofit 2 0非常簡單的入門(翻譯官方文件)
- Detectron2-寫模型(Write Models)官方文件中文翻譯模型
- Dapr 官方文件中文翻譯 v1.5 版本正式釋出
- ElasticSearch入門 官方文件翻譯 - 2.Exploring Your ClusterElasticsearch
- [翻譯]ElasticSearch官方文件-執行查詢和過濾操作Elasticsearch
- django1.8官方文件翻譯:8-5加密簽名Django加密
- ZooKeeper 官方教程[翻譯]
- [翻譯]CMAKE官方教程