堆
應用場景:
給定乙個無序陣列,要求找出前 k 個最大數
堆排序查詢第k大(小)元素
優先佇列
求動態集合中位數
定義:堆(heap),又被為優先佇列(priority queue),即優先順序高的先出隊。簡易理解:堆是一種數學模型,一種排序方式。能滿足以上應用場景。
性質:堆必須符合以下兩個條件:
是一棵完全二叉樹。
任意乙個節點的值都大於(或小於)左右子節點的值。
若父節點都大於等於左右子節點,則被稱為大頂堆,反之,若父節點都小於等於左右子節點則為小頂堆。
內部實現機制:
以小頂堆舉例:
上浮(promotion)
情境: 子節點的鍵值比父節點的鍵值小;
動作:交換子節點的鍵和父節點的鍵,重複這個過程直到堆的順序恢復正常
下沉(demotion)
情境:父節點的鍵值變得比子節點(乙個或者2個) 的鍵值還大
動作:父節點的鍵值和比它大的子節點的鍵值做交換,重複這個操作直到堆的順序恢復正常
例如:堆排序(heapsort)內部動作:
python 堆模組heapq:
heap.heapify(list),
將list轉換成為堆,原地,線性時間內。
heap = [8, 7, 3, 4, 5]
heapq.heapify(heap)
print(heap) #[3, 4, 8, 7, 5]
將 item 的值加入 heap 中,保持堆的不變性。
彈出並返回 heap 的最小的元素,保持堆的不變性。如果堆為空,丟擲 indexerror 。
使用 heap[0] ,可以只訪問最小的元素而不彈出它。
heap = [8, 7, 3, 4, 5]
print(heap) #[8, 7, 3, 4, 5, 9]
print(heap) #[3, 7, 9, 4, 5]
heap = [1, 2, 3, 4, 5]
print(heap) #[2, 4, 3, 9, 5]
heapq.heapreplace(heap, item),
彈出並返回 heap 中最小的一項,同時推入新的 item。 堆的大小不變。 如果堆為空則引發 indexerror。
nums = [9, 2, 4, 5, 7]
heapq.heapify(nums)
print(heapq.heapreplace(nums, 23)) #2
print(nums) #[4, 5, 23, 9, 7]
heapq.merge(*iterables, key=none, reverse=false),
將多個已排序的輸入合併為乙個已排序的輸出(例如,合併來自多個日誌檔案的帶時間戳的條目)。 返回已排序值的 iterator。
類似於 sorted(itertools.chain(*iterables)) 但返回乙個可迭代物件,不會一次性地將資料全部放入記憶體,並假定每個輸入流都是已排序的(從小到大)。
具有兩個可選引數,它們都必須指定為關鍵字引數。
key 指定帶有單個引數的 key function,用於從每個輸入元素中提取比較鍵。 預設值為 none (直接比較元素)。
reverse 為乙個布林值。 如果設為 true,則輸入元素將按比較結果逆序進行合併。 要達成與 sorted(itertools.chain(*iterables), reverse=true) 類似的行為,所有可迭代物件必須是已從大到小排序的。
在 3.5 版更改: 新增了可選的 key 和 reverse 形參。
import heapq
num1 = [32, 3, 5, 34, 54, 23, 132]
num2 = [23, 2, 12, 656, 324, 23, 54]
num1 = sorted(num1)
num2 = sorted(num2)
res = heapq.merge(num1, num2)
print(list(res))
#[2, 3, 5, 12, 23, 23, 23, 32, 34, 54, 54, 132, 324, 656]
import itertools
num1 = [32, 3, 5, 34, 54, 23, 132]
num2 = [23, 2, 12, 656, 324, 23, 54]
res1 = sorted(itertools.chain(num1, num2))
print(res1)
#[2, 3, 5, 12, 23, 23, 23, 32, 34, 54, 54, 132, 324, 656]
heapq.nlargest(n, iterable, key=none),
從 iterable 所定義的資料集中返回前 n 個最大元素組成的列表。
如果提供了 key 則其應指定乙個單引數的函式,用於從 iterable 的每個元素中提取比較鍵 (例如 key=str.lower)。 等價於: sorted(iterable, key=key, reverse=true)[:n]。
heapq.nsmallest(n, iterable, key=none),
從 iterable 所定義的資料集中返回前 n 個最小元素組成的列表。
如果提供了 key 則其應指定乙個單引數的函式,用於從 iterable 的每個元素中提取比較鍵 (例如 key=str.lower)。 等價於: sorted(iterable, key=key)[:n]。
後兩個函式在 n 值較小時效能最好。 對於更大的值,使用 sorted() 函式會更有效率。 此外,當 n==1 時,使用內建的 min() 和 max() 函式會更有效率。 如果需要重複使用這些函式,請考慮將可迭代物件轉為真正的堆。
list1 = [34, 25, 12, 99, 87, 63, 58, 78, 88, 92]
list2 = [,,
,,,print(heapq.nlargest(3, list1)) #[99, 92, 88]
print(heapq.nsmallest(3, list1)) #[12, 25, 34]
print(heapq.nlargest(2, list2, key=lambda x: x['price']))
#[, ]
print(heapq.nlargest(2, list2, key=lambda x: x['shares']))
#[, ]
標籤:heapq,heap,23,python,每日,練習,shares,key,print
python每日一練
人生苦短,我用python 2018.6.5 有個目錄,裡面是你自己寫過的程式,統計一下你寫過多少行 包括空行和注釋,但是要分別列出來 coding utf 8 import re import glob defcodecolletion path filelist glob.glob path p...
Python每日一練
人生苦短,我用python 2018.6.13 最近事情有點多,有幾天沒寫了,正好最近需要統計一下各組排名,也就拿python代替手工了 各組給出其他組的排名,統計每個組最終的得分,第一名為0.5,第二名0.4,以此類推。coding utf 8 groups 3,2,5,4,6 1,3,5,6,4...
Python每日一練0002
如何序列化輸出元素包含字串元組的字串元組 好繞 舉個例子 zoo1 monkey elephant zoo2 python zoo1 將zoo2輸出為python,monkey,elephant容易想到使用join 函式,但join 函式要求元素必須都是字串型別,否則會丟擲typeerror錯誤 z...