N個數中找出大的前K個數,需要用小堆實現。

分析:由于小堆的堆頂存放堆中最小的數據,可以通過與堆頂數據進行比較,將大數據存放在堆中,注意在每次改變堆頂數據后,進行調堆,使堆頂一直存放整個堆中最小元素。
void AdjustDown(int *a, size_t root, size_t size)//下調
{//小堆
size_t parent = root;
size_t child = parent * 2 + 1;
while (child < size)
{
if (child + 1 < size && a[child] > a[child + 1])
{
++child;
}
if (a[parent] > a[child])
{
swap(a[parent], a[child]);
parent = child;
child = parent * 2 + 1;
}
else//注意不滿足交換條件時跳出本次循環
{
break;
}
}
void CreateRetPacket(vector<int>& moneys)//創建N個數
{
srand((unsigned int)time(NULL));
//srand(time(0));
moneys.reserve(N);
for (size_t i = 0; i<N; i++)
{
moneys.push_back(rand() % 1000);//產生N個隨機值
}
for (size_t i = K; i < N; ++i)
{
moneys[i] *= 100;
}
}
void GetTopk(const vector<int>& moneys, int n, int k)//N個數中找大的前k個數--小堆實現
{
assert(n>k);
int *TopkArray = new int[k];//通過前k個元素建立含有k個元素的堆
for (size_t i = 0; i < k; i++)
{
TopkArray[i] = moneys[i];
}
for (int i = (k - 2) / 2; i >= 0; --i)//建小堆
{
AdjustDown(TopkArray, i, k);
}
//從第k個元素開始到第n個元素分別與堆頂元素進行比較,較大數據入堆頂,再對整個堆進行下調,使堆頂存放最小元素(小堆)
for (size_t i = k; i < n; ++i)
{
if (moneys[i] > TopkArray[0])
{
TopkArray[0] = moneys[i];
AdjustDown(TopkArray, 0, k);
}
}
size_t count = 0;
for (size_t i = 0; i < k; ++i)//打印k個大數據,即堆中所有元素
{
cout << TopkArray[i] << " ";
++count;
if (count % 10 == 0)
{
cout << endl;
}
}
cout << endl;
delete[] TopkArray;//注意釋放TopkArray所占的內存
TopkArray = NULL;
}測試用例如下:
#include<iostream>
#include<assert.h>
#include<vector>//容器--類模板
#include<stdlib.h>//利用隨機值
#include<time.h>
using namespace std;
#define N 10000
#define K 100
void Test8()
{//N個里面找大的前k個數
vector<int> moneys;
CreateRetPacket(moneys);
GetTopk(moneys, N, K);
}上述可實現下列題:
春節期間,A公司的支付軟件某寶和T公司某信紅包大亂戰。春節后高峰以后,公司Leader要求后臺的攻城獅對后臺的海量數據進行分析。先要求分析出各地區發紅包金額最多的前100用戶。現在知道人數最多的s地區大約有1000w用戶。
創新互聯www.cdcxhl.cn,專業提供香港、美國云服務器,動態BGP最優骨干路由自動選擇,持續穩定高效的網絡助力業務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節活動現已開啟,新人活動云服務器買多久送多久。
分享題目:【海量數據處理】N個數中找出最大的前K個數-創新互聯
URL標題:http://www.yijiale78.com/article18/dpcedp.html
成都網站建設公司_創新互聯,為您提供ChatGPT、外貿網站建設、網站營銷、定制開發、網頁設計公司、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯