Python 模塊 heapq-堆排序算法

Python 模塊 heapq-堆排序算法

模塊 heapq 實現了最小堆排序(min-heap)算法,它可以為一個列表進行堆排序。在一個堆排序的列表中,第N個的元素的子元素可以通過下標 2 * N + 1 和 2 * N + 2 訪問,這樣可以很方便的添加和刪除元素,有效利用內存。

最大堆(max-heap)是父級元素要比子級元素的值都大,而最小堆父級元素的值小於子級元素的值。Python 的模塊 heapq 實現的是最小堆。

打印樹結構


下面的代碼打印列表的樹結構展示。

Python 模塊 heapq-堆排序算法

創建堆


heappush() 函數逐一添加元素到堆中,heapify() 函數原地排序數據。

Python 模塊 heapq-堆排序算法

輸出:

Python 模塊 heapq-堆排序算法

如果數據已經存在內存中,則直接使用 heapify() 在原地修改數據。

Python 模塊 heapq-堆排序算法

執行:

Python 模塊 heapq-堆排序算法

訪問堆內容


使用 heappop() 從一個已經排好序的堆中刪除最小的值。

Python 模塊 heapq-堆排序算法

執行:

Python 模塊 heapq-堆排序算法

函數 heapreplace() 在刪除一個元素的同時,添加新元素。

Python 模塊 heapq-堆排序算法

執行:

Python 模塊 heapq-堆排序算法

函數 nlargest() 和 nsmallest() 分別返回最大的和最小的N個元素。

Python 模塊 heapq-堆排序算法

執行:

Python 模塊 heapq-堆排序算法

有效合併多個排序序列


當合並小數據集可以使用內置方法:

list(sorted(itertools.chain(*data)))

但是當操作大數據集合時,上面的代碼會加載所有的序列排序,可能要佔用大量的內存。使用 heapq 的 merge() 方法不需要一下處理所有的序列,而是每次處理一個,這樣更節省內存。

Python 模塊 heapq-堆排序算法

執行:

Python 模塊 heapq-堆排序算法


分享到:


相關文章: