模塊 heapq 實現了最小堆排序(min-heap)算法,它可以為一個列表進行堆排序。在一個堆排序的列表中,第N個的元素的子元素可以通過下標 2 * N + 1 和 2 * N + 2 訪問,這樣可以很方便的添加和刪除元素,有效利用內存。
最大堆(max-heap)是父級元素要比子級元素的值都大,而最小堆父級元素的值小於子級元素的值。Python 的模塊 heapq 實現的是最小堆。
打印樹結構
下面的代碼打印列表的樹結構展示。
創建堆
heappush() 函數逐一添加元素到堆中,heapify() 函數原地排序數據。
輸出:
如果數據已經存在內存中,則直接使用 heapify() 在原地修改數據。
執行:
訪問堆內容
使用 heappop() 從一個已經排好序的堆中刪除最小的值。
執行:
函數 heapreplace() 在刪除一個元素的同時,添加新元素。
執行:
函數 nlargest() 和 nsmallest() 分別返回最大的和最小的N個元素。
執行:
有效合併多個排序序列
當合並小數據集可以使用內置方法:
list(sorted(itertools.chain(*data)))
但是當操作大數據集合時,上面的代碼會加載所有的序列排序,可能要佔用大量的內存。使用 heapq 的 merge() 方法不需要一下處理所有的序列,而是每次處理一個,這樣更節省內存。
執行:
閱讀更多 趣喜歡編程 的文章