【海量数据处理】N个数中找出最大的前K个数

  

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个数