维护堆性质中,堆(完全二叉树)中i结点的子树大小至多为2n/3的证明
2015-12-05 12:30
417 查看
思路源自于:
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=堆(完全二叉树)中左子树节点数。
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=堆(完全二叉树)中左子树节点数。
相关文章推荐
- 源码分析:动态分析 Linux 内核函数调用关系
- 50元制作PS2键盘无线监控装置
- Apache Commons-SCXML系列之项目介绍
- nginx源码剖析(三) —— ngx_queue_t分析
- linux下的系统调用函数到内核函数的追踪
- Windows下Subversion和Apache的安装及配置(一)
- CentOS学习日记:PostgreSQL篇
- openwrt添加自己的应用程序
- Ubuntu 64位下解决“bash ./没有那个文件或目录”的问题
- Apache thrift 研究小记
- Linux_FTP服务器
- #Linux学习笔记# Linux系统查看文件内容的命令
- OpenJudge_P7625 三角形最佳路径问题(DP)
- copy和mutableCopy
- nginx 负载均衡分配
- Mastering Opencv ch3: markerless AR(一)
- 在Linux下创建分区和文件系统的方法详解
- Linux Is Not Matrix——repo浅解
- Linux串口驱动(8250)的编写与调试
- tomcat部署安装步聚