证明:在任一含n个元素的堆中,至多有ceiling(n/(2^(h+1)))个高度为h的节点。

证明:当n = 1时,高度为h=0的结点的个数为1=ceiling(1/(2^(0+1)))。
当n>=2时,任意给定一个n,用数学归纳法证明。

1、base:当h=0时,即高度为0的结点就是叶子结点。根据《算法导论》习题6.1-7可知,叶子结点的数目为
n-floor(n/2)=ceiling(n/2)=ceiling(n/(2^(0+1))),即满足上式。

2、step:取k为满足0<=k<floor(log2N)的任意整数(注释:log2N是以2为底n的对数)。假设对于高度h=k的结点,高度为k的结点数目是ceiling(n/(2^(h+1)))。
则高度为h=k+1的结点就是高度为k结点的父节点。高度为k结点的父节点的数目是高度为k结点的数目除2向上取整。
即ceiling(ceiling(n/(2^(k+1)))/2) = ceiling(n/(2 ^ (k+1+1)))。
证毕。

(缺少求高度为k结点的父节点的数目的方法介绍,可以求出第一个高度为k的结点的父节点的下标,再求出最后一个高度为k结点的父节点,两者之间就是所有父节点)。

参考:
参考1:《算法导论》CH6 习题6.3-3的证明,缺少对父节点数目求法的介绍。
参考2:Exercise 6.3.3,第二个参考可能是假设对任意n,当高度为h-1时成立。这个方法更好,因为避免求父节点数目。缺点是有点难懂。具体来看,已知,对于任意n,h=0成立。(则可推出,对于任意n,若h=1存在,则公式成立)。下图是参考2.

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值