国产探花免费观看_亚洲丰满少妇自慰呻吟_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個元素的次小值 ;重復執行,得到一個有序序列,這個就是堆排序的過程。

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长垣县| 肇州县| 漳浦县| 观塘区| 长武县| 涞水县| 乌兰县| 绍兴县| 中西区| 关岭| 双鸭山市| 尚义县| 和平县| 新宁县| 垫江县| 柘城县| 武宁县| 洛浦县| 长海县| 温宿县| 杭州市| 永清县| 夏津县| 莱芜市| 碌曲县| 潜江市| 台南县| 朝阳区| 大化| 勃利县| 清流县| 道真| 友谊县| 扶沟县| 睢宁县| 罗山县| 年辖:市辖区| 邵阳市| 赤峰市| 咸阳市| 宣化县|