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. JVM优化(中)

    09.垃圾收集器之串行垃圾收集器: 1.-Xms512m 等价于 -XX:InitialHeapSize=512设置JVM初始堆内存大小:-Xmx2048m 等价于 -XX:MaxHeapSize=2 ...

  2. windows/linux 更新python pip

    linux环境下 pip install -U pip windows环境下 python -m pip install -U pip python -m pip install --upgrade ...

  3. 指针函数(Pointer Function)和函数指针(Pointer to Function或Function Pointer)

    一.指针函数 1.解释:指针函数很好理解:简单来说,就是一个返回指针的函数,本质是一个函数.如: int fun(int x,int y);    //这是一个普通函数的声明,返回值是一个int类型, ...

  4. BZOJ 3876 支线剧情 有源汇有上下界最小费用可行流

    题意: 给定一张拓扑图,每条边有边权,每次只能从第一个点出发沿着拓扑图走一条路径,求遍历所有边所需要的最小边权和 分析: 这道题乍一看,可能会想到什么最小链覆盖之类的,但是仔细一想,会发现不行,一是因 ...

  5. [Algorithm] 2. Trailing Zeros

    Description Write an algorithm which computes the number of trailing zeros in n factorial. Example 1 ...

  6. UML系统建模学习

    什么是UML系统建模 UML系统建模是一种与面向对象软件开发密切相关的建模方法.通过建造模型可以验证建造事物的可行性.UML是一种统一建模语言,它的全称是(Unified Method Languag ...

  7. 洛谷 3106 [USACO14OPEN]GPS的决斗Dueling GPS's 3720 [AHOI2017初中组]guide

    [题解] 这两道题是完全一样的. 思路其实很简单,对于两种边权分别建反向图跑dijkstra. 如果某条边在某一种边权的图中不是最短路上的边,就把它的cnt加上1.(这样每条边的cnt是0或1或2,代 ...

  8. IDEA的Maven Projects无法显示

    记一个小坑: 前两天重装了一下电脑系统,下载了个最新的IDEA2018.3.5,把Maven.JDK.TomCat都设置好了 今天打开IDEA创建一个新的Maven项目,项目没有显示让我导入Maven ...

  9. 关于meta标签的使用,属性的说明

    原文转自:http://blog.csdn.net/gavid0124/article/details/46826127 网页源代码中有时候会遇到这样的一段代码: <metaname=" ...

  10. Jupyter notebook使用笔记

    常用快捷键 For a Cell,   Blue -> selecting. Green -> editing. Esc -> exist edit When the cell is ...