大根堆和小根堆在海量數(shù)據(jù)的top N問題中,時(shí)間復(fù)雜度O(nlogN)
堆可視化操作演示:https://visualgo.net/zh/heap
堆實(shí)際上是一棵完全二叉樹,其任何一非葉節(jié)點(diǎn)滿足性質(zhì):
小根堆:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2] 或者 大根堆 Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非葉節(jié)點(diǎn)的關(guān)鍵字不大于或者不小于其左右孩子節(jié)點(diǎn)的關(guān)鍵字。
堆分為大根堆和小根堆:
滿足Key[i]>=Key[2i+1]&&key>=key[2i+2]稱為大根堆(Max-heap),
滿足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]稱為小根堆(Min-heap)。
由上述性質(zhì)可知大根堆的堆頂?shù)年P(guān)鍵字肯定是所有關(guān)鍵字中最大的,小根堆的堆頂?shù)年P(guān)鍵字是所有關(guān)鍵字中最小的。

其中,大根堆和小根堆在海量數(shù)據(jù)的top N問題中,有著很好的時(shí)間復(fù)雜度。
利用小根堆解決獲取大量數(shù)據(jù)中最小的N個(gè)值
利用大根堆解決獲取大量數(shù)據(jù)中最大的N個(gè)值
堆調(diào)整一次的時(shí)間復(fù)雜度是O(logN)。所以,通過堆來解決top N 問題的時(shí)間復(fù)雜度是O(nlogN)
其中,n為數(shù)據(jù)的個(gè)數(shù),N為堆維護(hù)的數(shù)據(jù)的個(gè)數(shù)。
==================
實(shí)現(xiàn)堆,最關(guān)鍵的是對(duì)元素的移動(dòng)(上濾和下濾)。所有函數(shù)都是基于這兩種操作完成的。
binary heap的定義在維基百科中, sift-up 也稱為 up-heap 操作,sift-down 稱為 down-heap。
sift篩選
heapq.py中,
down指的是從堆底到堆頂?shù)倪^程,指的是元素的索引小了,down了。反過來,up就是堆頂?shù)蕉训椎倪^程,索引大了,up了。
_siftdown函數(shù):將元素向堆頂移動(dòng)到符合條件為止

浙公網(wǎng)安備 33010602011771號(hào)