国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中的heapq模塊源碼詳析

2020-02-16 00:31:52
字體:
來源:轉載
供稿:網友

起步

這是一個相當實用的內置模塊,但是很多人竟然不知道他的存在——筆者也是今天偶然看到的,哎……盡管如此,還是改變不了這個模塊好用的事實

heapq 模塊實現了適用于Python列表的最小堆排序算法。

堆是一個樹狀的數據結構,其中的子節點都與父母排序順序關系。因為堆排序中的樹是滿二叉樹,因此可以用列表來表示樹的結構,使得元素 N 的子元素位于 2N + 1 和 2N + 2 的位置(對于從零開始的索引)。

本文內容將分為三個部分,第一個部分簡單介紹 heapq 模塊的使用;第二部分回顧堆排序算法;第三部分分析heapq中的實現。

heapq 的使用

創建堆有兩個基本的方法:heappush() 和 heapify(),取出堆頂元素用 heappop()。

heappush() 是用來向已有的堆中添加元素,一般從空列表開始構建:

import heapqdata = [97, 38, 27, 50, 76, 65, 49, 13]heap = []for n in data: heapq.heappush(heap, n)print('pop:', heapq.heappop(heap)) # pop: 13print(heap) # [27, 50, 38, 97, 76, 65, 49]

如果數據已經在列表中,則使用 heapify() 進行重排:

import heapqdata = [97, 38, 27, 50, 76, 65, 49, 13]heapq.heapify(data)print('pop:', heapq.heappop(data)) # pop: 13print(data) # [27, 38, 49, 50, 76, 65, 97]

回顧堆排序算法

堆排序算法基本思想是:將無序序列建成一個堆,得到關鍵字最小(或最大的記錄;輸出堆頂的最小 (大)值后,使剩余的 n-1 個元素 重又建成一個堆,則可得到n個元素的次小值 ;重復執行,得到一個有序序列,這個就是堆排序的過程。

堆排序需要解決兩個問題:

如何由一個無序序列建立成一個堆? 如何在輸出堆頂元素之后,調整剩余元素,使之成為一個新的堆? 新添加元素和,如何調整堆?

先來看看第二個問題的解決方法。采用的方法叫“篩選”,當輸出堆頂元素之后,就將堆中最后一個元素代替之;然后將根結點值與左、右子樹的根結點值進行比較 ,并與其中小者進行交換;重復上述操作,直至葉子結點,將得到新的堆,稱這個從堆頂至葉子的調整過程為“篩選”。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 荔波县| 池州市| 洛宁县| 天等县| 正定县| 和平区| 乐至县| 建宁县| 克什克腾旗| 马尔康县| 铁岭市| 金华市| 鹤峰县| 忻城县| 高青县| 青田县| 敦煌市| 刚察县| 满城县| 崇义县| 泾源县| 宁国市| 海盐县| 广饶县| 安图县| 大埔区| 都安| 于田县| 宁陕县| 广南县| 鹤庆县| 临澧县| 呼玛县| 乌鲁木齐市| 辛集市| 新巴尔虎左旗| 迭部县| 夏河县| 青海省| 大荔县| 华池县|