應用場景:2023年春節期間,a公司的支付軟體某寶和t公司某信紅包大亂戰。春節高峰以後,公司leader要求後台攻城獅對後台的海量的資料進行分析。先要求分析出各地區發紅包最多的前100位使用者。現在知道人最多的s地區大約有100w使用者,要求寫乙個演算法實現。
分析:看到這裡,問題可以簡化為求很多個資料中的前100個節點,然而這很多個資料磁碟根本放不下,並且找出前100個數比較複雜,因此我們可以借助堆來實現。這樣資料從磁碟裡讀,而記憶體中只有100個資料。那麼到底是建大堆還是建小堆來解決呢?我們知道大堆就是父節點都大於孩子節點,小堆就是父節點都小於孩子節點,當我們找到的數大於最後乙個節點時堆就應該排序一次,因此我們應該建乙個小堆,根節點就是100裡面最小的,用父節點與需要比較的資料進行比較,如果比根節點大,那麼需要入堆進行排序,否則就不需要排序。實現**如下:
void createredpacket(vector& moneys) //建立紅包資料
for (int j = n - k; j < n; ++j)
}void adjustdown(int*a, size_t size, int root) //向下調整
else}}
void gettopk(vector& moneys) //獲取前k個資料
;for (size_t i = 0; i < k; ++i)
for (int i = (k- 2) / 2; i>=0; ++i) //先建乙個資料個數為k的堆
for (size_t i = k; i < n; ++i) //把剩下的資料一一跟對頂元素比較,如果資料小於堆頂元素就賦值給堆頂元素並向下調整
}for (int i = 0; i < k; ++i) //列印出前k個資料
cout << endl;
}void testtopk()
海量資料處理專題(五) 堆
什麼是堆 概念 堆是一種特殊的二叉樹,具備以下兩種性質 1 每個節點的值都大於 或者都小於,稱為最小堆 其子節點的值 2 樹是完全平衡的,並且最後一層的樹葉都在最左邊 這樣就定義了乙個最大堆。如下圖用乙個陣列來表示堆 那麼下面介紹二叉堆 二叉堆是一種完全二叉樹,其任意子樹的左右節點 如果有的話 的鍵...
海量資料處理專題(五) 堆
什麼是堆 概念 堆是一種特殊的二叉樹,具備以下兩種性質 1 每個節點的值都大於 或者都小於,稱為最小堆 其子節點的值 2 樹是完全平衡的,並且最後一層的樹葉都在最左邊 這樣就定義了乙個最大堆。如下圖用乙個陣列來表示堆 那麼下面介紹二叉堆 二叉堆是一種完全二叉樹,其任意子樹的左右節點 如果有的話 的鍵...
海量資料處理專題(五) 堆
什麼是堆 概念 堆是一種特殊的二叉樹,具備以下兩種性質 1 每個節點的值都大於 或者都小於,稱為最小堆 其子節點的值 2 樹是完全平衡的,並且最後一層的樹葉都在最左邊 這樣就定義了乙個最大堆。如下圖用乙個陣列來表示堆 那麼下面介紹二叉堆 二叉堆是一種完全二叉樹,其任意子樹的左右節點 如果有的話 的鍵...