N个数中找出最大的前K个数,需要用小堆实现。
分析:由于小堆的堆顶存放堆中最小的数据,可以通过与堆顶数据进行比较,将大数据存放在堆中,注意在每次改变堆顶数据后,进行调堆,使堆顶一直存放整个堆中最小元素。
void AdjustDown (int *, size_t 根,,size_t 大小)//下调 {//小堆 size_t parent =,根; size_t child =, parent *, 2, +, 1; while (child & lt;,大小) { if (child +, 1, & lt;, size ,,,一个(孩子),祝辞,[+ child 1]) { + +孩子; } if ((父),祝辞,(孩子)) { 交换((父),(孩子)); 时间=parent 儿童; *=child parent 2, +, 1; }//其他注意不满足交换条件时跳出本次循环 { 打破; } } void CreateRetPacket (vector,,钱)//创建N个数 { 将srand ((unsigned int)时间(NULL));//将srand(时间(0)); moneys.reserve (N); for (size_t 小姐:=,0;,i ,,钱,,int n, int k)//n个数中找最大的前k个数——小堆实现 { 断言(n> k); int * TopkArray =, new int [k];//通过前k个元素建立含有k个元素的堆 for (size_t 小姐:=,0;,小姐:& lt;, k;,我+ +) { TopkArray[我],=,钱[我]; } for (int 小姐:=,(k 安康;2),/,2,,小姐:祝辞=,0;,——我)//建小堆 { AdjustDown (TopkArray,,我,,k); }//从第k个元素开始到第n个元素分别与堆顶元素进行比较,较大数据入堆顶,再对整个堆进行下调,使堆顶存放最小元素(小堆) for (size_t 小姐:=,k;,小姐:& lt;, n,, + + i) { if (钱[我],,祝辞,TopkArray [0]) { TopkArray[0],=,钱[我]; AdjustDown (TopkArray, 0,, k); } } size_t count =, 0; for (size_t 小姐:=,0;,小姐:& lt;, k,, + + i)//打印k个最大数据,即堆中所有元素 { cout & lt; & lt;, TopkArray[我],& lt; & lt;,“,”; + +计数; if (count %, 10,==, 0) { cout & lt; & lt;, endl; } } cout & lt; & lt;, endl; 删除[],TopkArray;//注意释放TopkArray所占的内存 时间=TopkArray 零; }
测试用例如下:
# include# include # include //容器——类模板 # include //利用随机值 # include using namespace 性传播疾病; # define N 10000年 # define K 100年 void Test8 () {//N个里面找最大的前k个数 vector
【海量数据处理】N个数中找出最大的前K个数