最小堆_最大堆

本文介绍了一种在大规模数据集中查找最大或最小前N个元素的方法,通过使用最小堆或最大堆的数据结构来实现高效的查找。以100亿条int型数据为例,详细解释了如何构建和维护堆结构,以及如何利用该结构完成排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在大数查找中会遇到一类问题,例如在100亿条数据中找出 最大的(最小的) 前1000个元素。以int型4Byte为例,有1*1010*4 B = 4*1010/(230) B = 37.25G。

直接读取到内存中显然不合适,那么就需要:

首先,读取前1000个元素,建立一个最小堆(最大堆

其次,之后每读取一个元素就与最小堆根元素(1000个数中最小值)进行比较;

如果,新元素大于(小于堆顶元素

则,删除堆顶元素,将新元素插入堆顶。然后调整堆序,删除堆顶。。。。循环往复

#define leftChild(i)  (2*(i)+1)  //i = N-1时,(i)的优势就体现出来了

void interChange(elementType A[], int i, int N)
{
     int child;
     elementType tem;
     for(tem = A[i]; leftChild(i) < N; i = child) //每次调用都是从节点i开始的下滤过程。从0开始的前几个i有循环过程,后面几个到N/2都只有一次比较。
     {
         child = leftChild(i);
         if(child != N-1 && A[child+1] > A[child])
            child++;
         if(tem < A[child])   //保证在任意数组下,建立起最大堆
         A[i] = A[child];
         else
             break;
      }
      A[child] = tem;
}
void heapSort (elementType A[], int N)
{
       int i; 
       for(i = N/2; i >=0; i--)   //也可以用for(i = 0;2*i<N;i++)
           interChange(A, i, N);  //builfMaxHeap

       for(i = N-1; i > 0; i--)
       {
           swap(&A[0], &A[N-1]);  //deleteMax
           interChange(A, 0, i ); //在堆序性下,删除了最大元素后,从堆顶开始下滤,直至叶子节点
       }     
}

 

转载于:https://www.cnblogs.com/Lunais/p/5603906.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值