python每天必練 每日python練習3 堆

2021-10-16 18:35:54 字數 3246 閱讀 3159

應用場景:

給定乙個無序陣列,要求找出前 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...