最大heap
1 什么是最大heap
最大heap是一棵完全二叉树。每棵子树的根比它的两棵子树上的节点都要大。
2 建堆的过程
function max_heaptify(A):
for (i = n/2向下取整;i > 0; i--):
max_heaptify_one(A, i)
function max_heaptify_one(A, i):
[largerSon, largerSonIndex] = larger(A, i);
if largerSon < A[i]:
return
else:
tmp = A[i]
A[i] = A[largerSonIndex]
A[largerSonIndex] = tmp
max_heaptify_one(A, largerSonIndex)
3 建堆的时间复杂度
o(n),线性的。
假设要建的堆是一个满二叉树。从倒数第二层的最后一个结点往前都要进行以该结点为root的堆化,最坏情况下,每次堆化都要一直换到最底层的叶子结点处。
倒数第二层的结点有2^(h-1)个,每个需要进行1次比较,故共要进行(2^(h-1)*1)次比较;
倒数第三层的结点有2^(h-2)个,每个需要进行2次比较,故共要进行(2^(h-2)*2)次比较;
..................
第一层有1个结点,需要进行h-1次比较,故共要进行(1*(h-1))次比较;
加起来
N = (2^(h-1)*1) + (2^(h-2)*2) + ... + 1*(h-1) = (2-(2 + h)/(2^h)) * n
(2-(2 + h)/(2^h)) < 2
故O(n) = n,因此建堆的时间复杂度是线形的。
算法分析的过程本质上分析的是该算法的上界,因此在计算不等式的时候,该放的时候就要放。
4 堆排序
Max_Heaptify(A)
for i = 0; i < n; i ++:
B[i] = A[1]
A[1] = A[n - i]
Max_Heaptify_one(A, 1)
5 节点数为n的完全二叉树的非叶子节点个数为 n/2向下取整,叶子节点的个数为n/2向上取整
5.1 n向上取整等式
(n + r)整个的向上取整 = n向上取整 + r,这里r是整数
这个可以根据定义来证明,并且定义的区间里面只有一个整数,所以是等价的。只要是在这个区间里面的所有的整数都是同一个,都是相等的。
5.2 非叶子节点的个数求法如下
假如整棵树共有h层,非叶子节点分为两个部分:
第一,前h-2层的所有节点,总共2^(h-2) - 1
第二,第h-1层的部分节点,等于最后一层的所有的叶子结点的个数/2取上限,因为每个非叶子节点至少有一个儿子,所以是取上限。
最后一层的叶子节点数等于n - 2^(h-1) + 1,所以这一层的非叶子结点数为(n - 2^(h-1) + 1)/2向上取整。
这样非叶子结点总数为
2^(h-2) - 1 + (n - 2^(h-1) + 1)/2向上取整 = (n/2 - 1/2)向上取整 = n/2向下取整。
因此也叶子结点总数为n/2向上取整,这样总共有n个结点。
6 注意事项
6.1 实现堆时是从数组的下标为1开始的,不是从0开始的
A[0]是丢弃的,从A[1]开始。在比较根和两个儿子的大小的时候,是i和2i、2i+1进行比较的。
最大heap的更多相关文章
- java head space/ java.lang.OutOfMemoryError: Java heap space内存溢出
上一篇JMX/JConsole调试本地还可以在centos6.5 服务器上进行监控有个问题端口只开放22那么设置的9998端口 你怎么都连不上怎么监控?(如果大神知道还望指点,个人见解) 线上项目出现 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...
- JAVA Shallow heap & Retained heap
最近在研究内存泄漏的问题,在使用MAT工具中发现了Shallow heap & Retained heap,不懂. 然后在网上找了一些资料. Shallow Size 对象自身占用的内存大小, ...
- 笔记:程序内存管理 .bss .data .rodata .text stack heap
1.未初始化的全局变量(.bss段) bss段用来存放 没有被初始化 和 已经被初始化为0 的全局变量.如下例代码: #include<stdio.h> int bss_array[102 ...
- STL heap usage
简介 heap有查找时间复杂度O(1),查找.插入.删除时间复杂度为O(logN)的特性,STL中heap相关的操作如下: make_heap() push_heap() pop_heap() sor ...
- Nodemanager Out of heap memory[fix bug全过程]
问题: 自己写了一个yarn上的application,发现nodemanager过段时间,会out of memory退出,把nodemanager的heap memory从1G增大到2G也是无法避 ...
- Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32
今天使用Git在命令行下更新代码遇到了问题,起初觉得是自己安装某软件导致冲突,从网上搜索了一下找到类似问题,成功解决问题. 错误信息如下: E:\storm-sql>git pull origi ...
- Insert or Merge && Insertion or Heap Sort
原题连接:https://pta.patest.cn/pta/test/1342/exam/4/question/27102 题目如下: According to Wikipedia: Inserti ...
随机推荐
- 【C语言】控制台窗口图形界面编程(六):光标设置
目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...
- CSS Paint API绘制透明格子背景实例页面
CSS代码: .box { width: 180px; height: 180px; background: paint(transparent-grid); } HTML代码: <div cl ...
- CF147B Smile House
题目大意:给定一个有向图,其中边有边权.求点数最少的正环的点数. 题解:建立矩阵,处理其二进制上每一位的状态.时间O(n^3*log(n)). 代码: #include<cstdio> # ...
- [BZOJ] 1037 [ZJOI2008]生日聚会
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3007 Solved: 1795 [Submit][Status][Discuss] Descript ...
- xtrbackup备份mysql
mysqldump备份方式是采用逻辑备份,但是它最大的缺陷就是备份和恢复速度慢对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了. x ...
- 洛谷 4932 洛谷10月月赛II T1 浏览器
[题解] x xor y的结果在二进制下有奇数个1,等价于x与y在二进制下的1的个数之和为奇数,因为x xor y减少的1的个数一定是偶数(两个数这一位都为1,xor的结果为0,减少了2个1) 那么答 ...
- [bzoj1208][HNOI2004][宠物收养所] (平衡树)
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- Happy Three Friends
Happy Three Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- 主席树初探--BZOJ3524: [Poi2014]Couriers
n<=500000个数,m<=500000个询问,每次问区间里出现次数>(R-L+1)的数字是谁,没有输出0. 写了带修改发现不会不带修改了.... 不带修改的话,n个点,每个点表示 ...
- 删除右键open foler as pycharm project(WIN10)
1.打开注册表(WIN+R 输入regedit) 2.找到 HKEY_CLASSES_ROOT\Directory\Background 路径 下找到Parcharm文件夹,删除,右键的open fo ...