6.5-1
(a) 首先直接提取
(b) 然后令
(c) 然后调用MAX-HEAPIFY(A,1),因为
(d) 接着继续调换
(e) 继续调换
(f) 最后返回
6.5-2
(a) 首先增加A的堆长,令
(b) 然后令
(c) 接下来由于
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是最大堆,将关键字设为
6.5-5
初始化:第一次调用开始时,因为A原本就是最大堆,A的所有子树都是最大堆。由于
保持:在每次循环开始前,子树
终止:
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个有序链表中分别取出最小元素,构建最小堆,其时间复杂度是
(2)
通过HEAP-EXTRACT-MIN函数取出最小元素,时间复杂度是
(3)
一共有