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的更多相关文章

  1. java head space/ java.lang.OutOfMemoryError: Java heap space内存溢出

    上一篇JMX/JConsole调试本地还可以在centos6.5 服务器上进行监控有个问题端口只开放22那么设置的9998端口 你怎么都连不上怎么监控?(如果大神知道还望指点,个人见解) 线上项目出现 ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  4. Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap

    摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...

  5. JAVA Shallow heap & Retained heap

    最近在研究内存泄漏的问题,在使用MAT工具中发现了Shallow heap & Retained heap,不懂. 然后在网上找了一些资料. Shallow Size 对象自身占用的内存大小, ...

  6. 笔记:程序内存管理 .bss .data .rodata .text stack heap

    1.未初始化的全局变量(.bss段) bss段用来存放 没有被初始化 和 已经被初始化为0 的全局变量.如下例代码: #include<stdio.h> int bss_array[102 ...

  7. STL heap usage

    简介 heap有查找时间复杂度O(1),查找.插入.删除时间复杂度为O(logN)的特性,STL中heap相关的操作如下: make_heap() push_heap() pop_heap() sor ...

  8. Nodemanager Out of heap memory[fix bug全过程]

    问题: 自己写了一个yarn上的application,发现nodemanager过段时间,会out of memory退出,把nodemanager的heap memory从1G增大到2G也是无法避 ...

  9. Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32

    今天使用Git在命令行下更新代码遇到了问题,起初觉得是自己安装某软件导致冲突,从网上搜索了一下找到类似问题,成功解决问题. 错误信息如下: E:\storm-sql>git pull origi ...

  10. Insert or Merge && Insertion or Heap Sort

    原题连接:https://pta.patest.cn/pta/test/1342/exam/4/question/27102 题目如下: According to Wikipedia: Inserti ...

随机推荐

  1. 第4节 hive调优:1、2、fetch抓取和表的优化

    hive的调优:第一个调优:fetch抓取,能够避免使用mr的,就尽量不要用mr,因为mr太慢了 set hive.fetch.task.conversion=more 表示我们的全局查找,字段查找, ...

  2. PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战

    版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢!http://blog.csdn.net/m0_37306360/article/details/79318644简介在这个项目中,我们将使 ...

  3. tensorflow 学习笔记-- tf.reduce_max、tf.sequence_mask

    1.tf.reduce_max函数的作用:计算张量的各个维度上的元素的最大值.例子: import tensorflow as tfmax_value = tf.reduce_max([1, 3, 2 ...

  4. mac apache 配置

    mac系统自带apache这无疑给广大的开发朋友提供了便利,接下来是针对其中的一些说明 一.自带apache相关命令 1. sudo apachectl start 启动服务,需要权限,就是你计算机的 ...

  5. Apollo源码解析看一文就够

    对于配置中心我们先抛出问号三连,什么是配置中心?为什么要用配置中心?配置中心怎么用? 笔者说说自己理解的配置中心,个人观点的十六字 消息存储 消息推送 环境隔离 灰度发布 今天我们先来看Apollo配 ...

  6. Qt笔记——各种组件和其他细碎用法

    LineEdit 获取文本:ui->usrLineEdit->text() 清空内容:ui->pwdLineEdit->clear(); 定位光标:ui->usrLine ...

  7. 测试自动化接口jenkins配置

    <br/><font color="red" size"3" face="微软雅黑">本邮件是程序自动下发,请勿回复 ...

  8. Mongo的Replica Sets (复制集)的配置全过程和心得体会

    http://blog.csdn.net/bloggongchang/article/details/7272403 一.MongoDB Replica Sets(副本集)简单的说就是有自动故障恢复功 ...

  9. C++对拍数据生成

    #include<map> #include<ctime> #include<queue> #include<cmath> #include<cs ...

  10. 在windows下安装Django

    2013-07-24 21:23:30| 1.安装Python 我安装的是Python(x,y)-2.7.5.0,安装目录在C盘.安装成功后如下图所示.   2.安装Django 从https://w ...