博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最小堆_最大堆
阅读量:5270 次
发布时间:2019-06-14

本文共 1034 字,大约阅读时间需要 3 分钟。

在大数查找中会遇到一类问题,例如在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
0; i--) { swap(&A[0], &A[N-1]); //deleteMax interChange(A, 0, i ); //在堆序性下,删除了最大元素后,从堆顶开始下滤,直至叶子节点 } }

 

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

你可能感兴趣的文章
linux下WPS的使用
查看>>
hdu 3938 并查集
查看>>
instanceof
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
2015/8/4 告别飞思卡尔,抛下包袱上路
查看>>
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>