维护堆性质中,堆(完全二叉树)中i结点的子树大小至多为2n/3的证明
来源:互联网 发布:网络安全法考试单选 编辑:程序博客网 时间:2024/05/16 06:33
思路源自于:
http://bbs.sjtu.edu.cn/bbstcon,board,Algorithm,reid,1242723801,file,M.1242723801.A.html
在理解维护堆性质时,算法导论上面只简单提了一下子树的大小为2n/3,不明白,从网上理解得到如下结论。
已知:
当堆是满二叉树时:(ceiling表示其最大值)
最底层的元素个数为ceiling(n/2)个,这层高度为0;
倒数第二层元素个数为ceiling(n/4)个,高度为1;
倒数第三层元素个数为ceiling(n/8)个,高度为2;
如此类推,高度为h的,在倒数第h + 1层,元素个数为ceiling(n / 2^(h + 1))。
注意:高度是从最底层算起,最底层为0,而深度是从最高层算起,根节点处为高度0.
证明如下:
规定总size为n,要求根的左子树的最大size。(由于右子树size总是<=左子树size)。那么显然,观察最底层节点数目为0, 1, 2…的情况,显然半满的时候左子树达到了最大。半满定义:最底层的叶子节点个数=满二叉树的一半,且底层半满的元素都在左子树上面。以下求此时左子树的大小:
设底层半满时节点数为y,则再加y个节点,就是满树,并且根据满二叉树的特点—若底层元素个数为x,则元素总数为2x-1.
由此得到:n + y = (2y) * 2 - 1 = 满树size,可得n = 3y - 1。
满树时,左子树节点数 = (满树size - 1) / 2 = (4y-1)/2=2y= 2n / 3=堆(完全二叉树)中左子树节点数。
- 维护堆性质中,堆(完全二叉树)中i结点的子树大小至多为2n/3的证明
- 堆中i结点的子树大小至多为2n/3的证明
- n个结点的堆中结点i的子树大小至多为2n/3
- 一棵以节点i为根的、大小为n的子树上,i节点的子树大小至多为2n/3(最坏情:底层恰好半满的时候)
- 堆(完全二叉树)的性质
- 求二叉树中以x为值的根结点的子树的深度
- 算法导论6.3-3 证明完全二叉树高度为h的结点个数上限「n/2^(h+1)」
- 堆排序建堆复杂度为O(n)的证明
- 堆的一些性质以及证明
- 二叉树的各种实现(创建,叶子结点数,是否为堆,完全二叉树,二叉查找树,交换左右孩子)
- CLRS 6.2维护堆的性质
- 二叉树-求结点m所在子树中包括的结点的数目
- 数据结构 - 互换二叉树中所有结点的左右子树(C++)
- Python 技巧(二) 最小堆实现以及维护一个大小为100的最小堆
- 证明:在一棵有n个结点的二叉查找树中,刚好有n-1种可能的旋转
- 找出二叉树中最大的子树,且子树为二叉搜索树
- 证明:一个有n个结点的非空二叉树的高度至少为lgn
- 证明:一个有n个结点的非空二叉树的高度至少为lgn
- Distinctive Image Features from Scale-Invariant Keypoints-SIFT算法译文
- KEIL MDK5.10开发环境安装教程(本文提供资源适用于STM32F03x/STM32F10x/STM32F4x系列控制器)
- HDU-5533-Dancing Stars on Me【2015长春赛区】
- 各种版本控制工具的使用
- 每次开机后MySQL服务都不见了需要重新开mysqld-debug的解决办法
- 维护堆性质中,堆(完全二叉树)中i结点的子树大小至多为2n/3的证明
- multiple reactors + thread pool(one loop per thread + threadpool)(突发I/O与密集计算)
- LintCode-剑指Offer-(88)最近公共祖先
- 【基于Jsoup】Android_App暴走笑话开发(二)
- java ssh整合出的错java.lang.NoSuchMethodError antlr.collections.AST.getLine()I
- opencv 图片转视频
- 代码实现利用inf文件安装硬件驱动
- Maven +SpringMVC 搭建时候遇到视图view跳转失败问题
- Qt5 UDP开发