• 海量数据中,寻找最小的k个数。


    维护k个元素的最大堆,即用容量为k的最大堆存储最小的k个数,k1设为大顶堆中最大元素。遍历一次数列,n,每次遍历一个元素x,与堆顶元素比 较,x<kmax,更新堆,否则不更新堆。

     1 // 海量数据中,寻找最小的k个数(堆).cpp : 定义控制台应用程序的入口点。
     2 
     3 #include "stdafx.h"
     4 #include <string.h>
     5 #define MAX 1000
     6 
     7 void swap(int &a,int &b)
     8 {
     9     int c;
    10     c=a;
    11     a=b;
    12     b=c;
    13 }
    14 
    15 void max_heapity(int heap[],int i,int len)//保持最大堆性质
    16 {
    17     int left=2*i, right=2*i+1,largest=-1;
    18     if((left<=len)&&(heap[left]>heap[i]))
    19         largest=left;
    20     else 
    21         largest=i;
    22     if((right<=len)&&(heap[right]>heap[largest]))
    23         largest=right;
    24     if(largest!=i)
    25         {
    26             swap(heap[largest],heap[i]);
    27             max_heapity(heap,largest,len);
    28         }
    29 }
    30 
    31 void build_maxheap(int heap[],int len) //建立最大堆
    32 {
    33     int index=len/2;
    34     for(int i=index;i>=1;i--)
    35          max_heapity(heap,i,len);
    36 }
    37 
    38 void main()
    39 {
    40     int k=5,heap[]={0,3,12,6,7,15,13,24,1,4,9,10,16,20,63,45,37,86};//这里只列了少量数据进行验证,实际中应该从文件中读取数据
    41     //第一个元素不计入,因这里有关堆的算法都是从下标为1开始的
    42     int len=sizeof(heap)/sizeof(heap[0]);
    43     build_maxheap(heap,k);//建立k个元素的最大堆
    44     for(int i=1;i<len;i++)
    45     {
    46         if(heap[i]<heap[1]) //如果遇到比堆顶元素小的元素,就更新堆
    47         {
    48             heap[1]=heap[i];
    49             max_heapity(heap,1,k);
    50         }
    51     }
    52     for(int j=1;j<=k;j++)
    53         printf("%4d",heap[j]);
    54 }
  • 相关阅读:
    3月14日进度博客
    构建之法阅读笔记01
    课堂练习-全国疫情统计3
    课堂练习-全球疫情统计2
    课堂练习-全国疫情统计1
    跟我一起写 Makefile(五)
    跟我一起写 Makefile(四)
    跟我一起写 Makefile(三)
    跟我一起写 Makefile(二)
    跟我一起写 Makefile(一)
  • 原文地址:https://www.cnblogs.com/xingele0917/p/2723432.html
Copyright © 2020-2023  润新知