算法导论第三版习题6.5

时间:2022-01-27 00:10:54

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)