海量資料處理專題(五) 堆

2021-09-30 10:10:03 字數 900 閱讀 9864

【什麼是堆】

概念:堆是一種特殊的二叉樹,具備以下兩種性質

1)每個節點的值都大於(或者都小於,稱為最小堆)其子節點的值

2)樹是完全平衡的,並且最後一層的樹葉都在最左邊

這樣就定義了乙個最大堆。如下圖用乙個陣列來表示堆:

那麼下面介紹二叉堆:二叉堆是一種完全二叉樹,其任意子樹的左右節點(如果有的話)的鍵值一定比根節點大,上圖其實就是乙個二叉堆。

你一定發覺了,最小的乙個元素就是陣列第乙個元素,那麼二叉堆這種有序佇列如何入隊呢?看圖:

假設要在這個二叉堆裡入隊乙個單元,鍵值為2,那只需在陣列末尾加入這個元素,然後盡可能把這個元素往上挪,直到挪不動,經過了這種複雜度為ο(logn)的操作,二叉堆還是二叉堆。

那如何出隊呢?也不難,看圖:

出隊一定是出陣列的第乙個元素,這麼來第乙個元素以前的位置就成了空位,我們需要把這個空位挪至葉子節點,然後把陣列最後乙個元素插入這個空位,把這個「空位」盡量往上挪。這種操作的複雜度也是ο(logn)。

【適用範圍】

海量資料前n大,並且n比較小,堆可以放入記憶體

【基本原理及要點】

最大堆求前n小,最小堆求前n大。方法,比如求前n小,我們比較當前元素與最大堆裡的最大元素,如果它小於最大元素,則應該替換那個最大元 素。這樣最後得到的n個元素就是最小的n個。適合大資料量,求前n小,n的大小比較小的情況,這樣可以掃瞄一遍即可得到所有的前n元素,效率很高。

【擴充套件】

雙堆,乙個最大堆與乙個最小堆結合,可以用來維護中位數。

【問題例項】

1)100w個數中找最大的前100個數。

用乙個100個元素大小的最小堆即可。

海量資料處理專題(五) 堆

什麼是堆 概念 堆是一種特殊的二叉樹,具備以下兩種性質 1 每個節點的值都大於 或者都小於,稱為最小堆 其子節點的值 2 樹是完全平衡的,並且最後一層的樹葉都在最左邊 這樣就定義了乙個最大堆。如下圖用乙個陣列來表示堆 那麼下面介紹二叉堆 二叉堆是一種完全二叉樹,其任意子樹的左右節點 如果有的話 的鍵...

海量資料處理專題(五) 堆

什麼是堆 概念 堆是一種特殊的二叉樹,具備以下兩種性質 1 每個節點的值都大於 或者都小於,稱為最小堆 其子節點的值 2 樹是完全平衡的,並且最後一層的樹葉都在最左邊 這樣就定義了乙個最大堆。如下圖用乙個陣列來表示堆 那麼下面介紹二叉堆 二叉堆是一種完全二叉樹,其任意子樹的左右節點 如果有的話 的鍵...

海量資料處理專題(四) Bit map

什麼是bit map 所謂的bit map就是用乙個bit位來標記某個元素對應的value,而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。如果說了這麼多還沒明白什麼是bit map,那麼我們來看乙個具體的例子,假設我們要對0 7內的5個元素 4,7,2,5,...