20庫的新增 Python heapq庫的用法介紹

2021-10-14 19:56:38 字數 2138 閱讀 4282

一、heapq庫簡介

heapq 庫是python標準庫之一,提供了構建小頂堆的方法和一些對小頂堆的基本操作方法(如入堆,出堆等),可以用於實現堆排序演算法。堆是一種基本的資料結構,堆的結構是一棵完全二叉樹,並且滿足堆積的性質:每個節點(葉節點除外)的值都大於等於(或都小於等於)它的子節點。堆結構分為大頂堆和小頂堆,在heapq中使用的是小頂堆:1. 大頂堆:每個節點(葉節點除外)的值都大於等於其子節點的值,根節點的值是所有節點中最大的。2. 小頂堆:每個節點(葉節點除外)的值都小於等於其子節點的值,根節點的值是所有節點中最小的。在heapq庫中,heapq使用的資料型別是python的基本資料型別 list ,要滿足堆積的性質,則在這個列表中,索引 k 的值要小於等於索引 2*k+1 的值和索引 2*k+2 的值(在完全二叉樹中,將資料按廣度優先插入,索引為k的節點的子節點索引分別為2*k+1和2*k+2)。在heapq庫的原始碼中也有介紹,可以讀一下heapq的原始碼,**不多。使用python實現堆排序可以參考:python實現堆排序完全二叉樹的特性可以參考:二叉樹簡介

二、使用heapq建立堆

執行結果:

使用heapify(array)得到的堆結構如下。

不過,這兩個結果都滿足小頂堆的特性,不影響堆的使用(堆只會從堆頂開始取資料,取出資料後會重新調整結構)。

三、使用heapq實現堆排序

執行結果:

5heap sort result:  [5, 7, 10, 15, 17, 21, 24, 27, 30, 36, 45, 50]四、獲取堆中的最小值或最大值array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]heapq.heapify(array)print(heapq.nlargest(2, array))print(heapq.nsmallest(3, array))

執行結果:
[50, 45][5, 7, 10]
nlargest(num, heap),從堆中取出num個資料,從最大的資料開始取,返回結果是乙個列表(即使只取乙個資料)。如果num大於等於堆中的資料數量,則從大到小取出堆中的所有資料,不會報錯,相當於實現了降序排序。nsmallest(num, heap),從堆中取出num個資料,從最小的資料開始取,返回結果是乙個列表。這兩個方法除了可以用於堆,也可以直接用於列表,功能一樣。

五、使用heapq合併兩個有序列表

array_a = [10, 7, 15, 8]array_b = [17, 3, 8, 20, 13]array_merge = heapq.merge(sorted(array_a), sorted(array_b))print("merge result:", list(array_merge))
執行結果:
merge result: [3, 7, 8, 8, 10, 13, 15, 17, 20]
merge(list1, list2),將兩個有序的列表合併成乙個新的有序列表,返回結果是乙個迭代器。這個方法可以用於歸併排序。

六、heapq替換資料的方法

執行結果:before: [7, 8, 15, 10]after: [7, 8, 15, 10]5before: [7, 8, 15, 10]after: [5, 8, 15, 10]7

ASIHTTPRequest庫的新增

b.把classes裡的檔案,拖到xcode中 c.匯入框架 systemconfiguration.framework mobilecoreservices.framework coregraphics.framework cfnetwork.framework libz.1.2.3.dylib ...

C 2 0 新增功能

泛型 該語言中新增了一些泛型型別,使得程式設計師能夠實現程度很高的 重用,獲得更高的集合類效能。泛型型別只存在 arity 上的不同。也可以將引數強制為特定的型別。有關更多資訊,請參見泛型型別引數。迭代器 迭代器使得規定 foreach 迴圈將如何迴圈訪問集合的內容變得更加容易。分部類 分部型別定義...

新增庫檔案

1.ws2 32.lib 是msvc的導入庫,mingw中的是 libws2 32.a 2.pragma comment lib,是 msvc 專有的,mingw 沒有類似寫法 3.在pro檔案內 加入 libs lws2 32 即可,無論你用的 msvc 還是 mingw 結論 要注意dll版本,...