算法导论第三版习题6.5

6.5-1

(a) 首先直接提取 max=A[1]=15
(b) 然后令 A[1]=A[heap_size]=1 ,让 heap_size=heap_size1 ,此时堆A为 A={1,13,9,5,12,8,7,4,0,6,2}
(c) 然后调用MAX-HEAPIFY(A,1),因为 A[1]<A[3]<A[2] ,故调换 A[1]A[2] 得到 A={13,1,9,5,12,8,7,4,0,6,2}
(d) 接着继续调换 A[2]A[5] 得到 A′′={13,12,9,5,1,8,7,4,0,6,2}
(e) 继续调换 A[5]A[10]A′′′={13,12,9,5,6,8,7,4,0,1,2}
(f) 最后返回 max

6.5-2

(a) 首先增加A的堆长,令 A.heap_size=A.heap_size+1=13 ,并且令 A[13]=
(b) 然后令 A[13]=10 ,由于 A[13]>A[6] ,故交换 A[6]A[13] ,得到 A={15,13,9,5,12,10,7,4,0,6,2,1,8}
(c) 接下来由于 A[3]<A[6]A[6]A[3]A′′={15,13,10,5,12,9,7,4,0,6,2,1,8} A′′ 即为插入之后的最大堆。

6.5-3

HEAP-MINMUN(A)
1 return A[1]

HEAP-EXTRACT-MIN(A)
1 if A.heap-size < 1
2   error "heap underflow"
3 min = A[1]
4 A[1] = A[A.heap-size]
5 A.heap-size = A.heap-size - 1
6 MIN-HEAPIFY(A,1)
7 return min

HEAP-DECREACE-KEY(A,i,key)
1 if key > A[i]
2   error "new key is bigger than current key"
3 A[i] = key
4 while i > 1 and A[PARENT(i)] > A[i]
5   exchange A[i] with A[PARENT(i)]
6   i = PARENT(i)

MIN-HEAP-INSERT(A,key)
1 A.heap-size = A.heap-size + 1
2 A[A.heap-size] = -infty
3 HEAP-DECREASE-KEY(A, A.heap-size, key)

6.5-4

因为函数HEAP-INCREASE-KEY(A, A.heap-size, key)要求堆A是最大堆,将关键字设为 ,在将元素插入后,整个堆仍然是最大堆,然后才能利用HEAP-INCREASE-KEY(A, A.heap-size, key)。

6.5-5

初始化:第一次调用开始时,因为A原本就是最大堆,A的所有子树都是最大堆。由于 key>A[i] ,所以我们已经令 A[i]=key ,子树A A[i..A.heapsize] 还是满足最大堆性质。此时若 A[PARENT(i)>A[i] ,则子数组 A[1..A.heapsize] 显然还是最大堆,否则就是 A[i]>A[PARENT(i)]
保持:在每次循环开始前,子树 A[i..A.heapsize] 都是最大堆,若 A[PARENT(i)]>A[i] ,则子数组 A[1..A.heapsize] 满足最大堆性质,否则就是 A[i]>A[PARENT(i) ;
终止: i=23PARENT(i)=1 ,若 A[i]<A[1] ,因为 A[i..A.heapsize] 就是一个最大堆,此时整个数组就是一个最大堆;否则就是 A[i]<A[1] ,交换 A[i]A[1]A[1..A.heapsize] 整个就是最大堆了。

6.5-6

HEAP-INCREASE-KEY(A,i,key)
1 if key < A[i]
2   error "new key is smaller than current key"
3 while i > 1 and A[PARENT(i)] < key
4   A[i] = A[PARENT]
5   i = PARENT(i)
6 A[i] = key

6.5-7

实现先进先出队列时,将元素以依次减小的优先度插入到队列中;而对于栈,则以依次增大的优先度加入到栈中。

6.5-8

HEAP-DELETE(A,i)
1 A[i] = 负无穷
2 MAX-HEAPIFY(A,i)
3 A.heap-size = A.heap-size - 1

6.5-9

(1)

首先从k个有序链表中分别取出最小元素,构建最小堆,其时间复杂度是 O(k)

(2)

通过HEAP-EXTRACT-MIN函数取出最小元素,时间复杂度是 O(lgk) ,然后再从这个被取出的元素的原先所在的那个有序链表中取出最小元素(除非该链表已经为空,此时省略插入到堆的操作),用MIN-HEAP_INSERT函数插入到堆中,时间复杂度也是 O(lgk) ,所以这一步总的时间复杂度是 O(lgk)

(3)

一共有 n 个元素,需要重复执行第二步nk次,故步骤2和步骤3一共时间复杂度为 O[(nk)lgk] 。总的复杂度就是 O(k)+O[(nk)lgk] ,所以复杂度为 O(nlgk)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值