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

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

猜你喜欢

转载自blog.csdn.net/yangtzhou/article/details/84867001