堆
2015-08-16 23:12
176 查看
数据结构之堆
[什么是堆]
概念:堆是一种特殊的二叉树,具备以下两种性质
1)每个节点的值都大于(或者都小于,称为最小堆)其子节点的值;
2)树是完全平衡的,并且最后一层的树叶都在最左边
这样就定义了一个最大堆,如下图用一个数组来表示堆:
现在具体说明下二叉堆:二叉堆是一种完全二叉树,其任意子树的左右节点(如果有的话)的键值一定比根节点大,上图其实就是一个二叉堆。
最小的一个元素就是数组第一个元素,那么二叉堆这种有序队列如何入队呢?
假设要在这个二叉堆里入队一个单元,键值为2,那么只需在数组末尾加入这个元素,然后尽可能把这个元素往上移动,直到挪不动,经过了这种复杂度O(logn)的操作,二叉堆还是二叉堆。
那么如何出队呢?也不难,看图:
出队一定是出数组的第一个元素,这么来第一个元素以前的位置就是成了空位,我们需要把这个空位挪动至叶子节点,然后把数组最后一个元素插入这个空位,把这个空位尽量往上挪。这种操作的复杂度是O(logn).
[适用范围]
海量数据前n大,并且n比较小,堆可以放入内存。(TOP k问题)
[基本原理及要点]
最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元素,这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样就可以扫面一遍即可得到所有的前n元素,效率很高。
[扩展]
双堆,一个最大堆与一个最小堆结合,可以用来维护中位数
[问题实例]
1)100w个数中找最大的前100个数。
[什么是堆]
概念:堆是一种特殊的二叉树,具备以下两种性质
1)每个节点的值都大于(或者都小于,称为最小堆)其子节点的值;
2)树是完全平衡的,并且最后一层的树叶都在最左边
这样就定义了一个最大堆,如下图用一个数组来表示堆:
现在具体说明下二叉堆:二叉堆是一种完全二叉树,其任意子树的左右节点(如果有的话)的键值一定比根节点大,上图其实就是一个二叉堆。
最小的一个元素就是数组第一个元素,那么二叉堆这种有序队列如何入队呢?
假设要在这个二叉堆里入队一个单元,键值为2,那么只需在数组末尾加入这个元素,然后尽可能把这个元素往上移动,直到挪不动,经过了这种复杂度O(logn)的操作,二叉堆还是二叉堆。
那么如何出队呢?也不难,看图:
出队一定是出数组的第一个元素,这么来第一个元素以前的位置就是成了空位,我们需要把这个空位挪动至叶子节点,然后把数组最后一个元素插入这个空位,把这个空位尽量往上挪。这种操作的复杂度是O(logn).
[适用范围]
海量数据前n大,并且n比较小,堆可以放入内存。(TOP k问题)
[基本原理及要点]
最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元素,这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样就可以扫面一遍即可得到所有的前n元素,效率很高。
[扩展]
双堆,一个最大堆与一个最小堆结合,可以用来维护中位数
[问题实例]
1)100w个数中找最大的前100个数。
相关文章推荐
- string字符串
- ASP.NET(2)——Web服务器对象
- 扩展方法学习总结
- 黑马程序员——枚举(JDK5的新特性)
- python+Eclipse+pydev环境搭建
- 1077. Kuchiguse (20)
- Linux系统中查看日志的常用命令
- 黑马程序员——反射与正则表达式
- PXE项目实战,通过编写脚本自动安装系统时批量部署服务器所需要的所有服务
- python去掉html标签
- STM32的IO配置点灯
- python去掉html标签
- 清理Android项目中没用的资源
- @property关键字和几个描述符号(不全,待补充)
- DHCP Snooping简介
- 实现线程串行执行
- ubuntu 14.04 任务栏无法显示时间
- Android本地数据存储复习
- WPF中的右键菜单ContextMenu
- 第一百三十六天 how can I坚持