最大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 ...
随机推荐
- 并发-5CAS与AQS
juc: java.util.concurrent 锁: 悲观锁:写的比较多,对数据的增删改,读(查)少.Lock 乐观锁:反之,读多写少.版本 并发编程之 CAS 的原理 什么是CAS CAS (c ...
- selenium click radio
radio = dr.find_element_by_xpath('//*[@id="contentTable"]/tbody/tr[1]/td[1]/input') webdri ...
- selenium抓取动态网页数据
1.selenium抓取动态网页数据基础介绍 1.1 什么是AJAX AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进 ...
- Java中Date类型的工具类
package com.mytripod.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import ja ...
- [Python3网络爬虫开发实战] 3.3-正则表达式
本节中,我们看一下正则表达式的相关用法.正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索.替换.匹配验证都不在话下. 当然,对于爬虫来说,有了它,从HTML里提取想要 ...
- 【Jsp,Servlet初学总结】 含 cookie和session的使用
一.Jsp 1. 指令: <%@ page language="java" import="java.*" contextType="text/ ...
- jupyter 教程
官网: http://jupyter.org/
- scrapy快速入门
1. 什么是scrapy? 其官网是这样简述的,“A Fast & Powerful Scraping &Crawling Framework ”, 并且其底层以twisted作为网 ...
- jQuery调用WCF 说明
在项目中用过一些WCF的技术这篇文章是对以前用过的一点东西的一个梳理 一,webconfig的配置除了一般的配置外,与WCF相关的配置如下 <system.serviceModel> ...
- BNUOJ 1589 Closest Common Ancestors
Closest Common Ancestors Time Limit: 2000ms Memory Limit: 10000KB This problem will be judged on PKU ...