算法导论 — 思考题6-1 用插入的方法建堆

用插入的方法建堆)我们们可以通过反复调用MAX-HEAP-INSERT实现向一个堆中插入元素,考虑BUILD-MAX-HEAP的如下实现方式:
  在这里插入图片描述
  a. 当输入数据相同的时候,BUILD-MAX-HEAP和BUILD-MAX-HEAP’生成的堆是否总是一样?如果是,请证明;否则,请举出一个反例。
  b. 证明:在最坏情况下,调用BUILD-MAX-HEAP’建立一个包含 n n n个元素的堆的时间复杂度是 Θ ( n l g n ) Θ(n{\rm lg}n) Θ(nlgn)
  
  
  a.
  两种方法生成的堆有可能不一样。例如,取 A A A = {1, 2, 3, 4}。采用BUILD-MAX-HEAP生成的堆为
  在这里插入图片描述
  而采用BUILD-MAX-HEAP’(插入方法)生成的堆为
  在这里插入图片描述
  b.
  最坏情况为 A A A中的元素按升序排列。此时,每插入一个元素 i i i,都要将该元素移动到根结点,移动的步数为当前元素在堆中的深度 d i d_i di。建堆的总时间取决于插入每个元素所移动的步数之和,即堆中所有元素的深度之和。
  简化分析,假设最终建立的堆为一棵满二叉树,它的高度为 h = ⌊ l g n ⌋ h=⌊{\rm lg}n⌋ h=lgn,并且堆中的元素个数为 n = 2 h + 1 − 1 n=2^{h+1}-1 n=2h+11。我们对每一层进行分析,可以得到下表。
  在这里插入图片描述
  将每一层所有结点的深度和相加,即可得到整个堆中所有元素的深度之和 T ( n ) T(n) T(n)
  在这里插入图片描述
  因此,在最坏情况下,用插入方法建立一个包含 n n n个元素的堆的时间复杂度是 Θ ( n l g n ) Θ(n{\rm lg}n) Θ(nlgn)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值