堆的應用之海量資料處理(紅包大亂戰)

2022-10-11 05:45:12 字數 890 閱讀 1355

應用場景: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 樹是完全平衡的,並且最後一層的樹葉都在最左邊 這樣就定義了乙個最大堆。如下圖用乙個陣列來表示堆 那麼下面介紹二叉堆 二叉堆是一種完全二叉樹,其任意子樹的左右節點 如果有的話 的鍵...