6-1
a.
不一样。例如习题6.3-1中的数组A,如果采用BUILD-MAX-HEAP算法得到的最大堆为A1={84,22,19,10,3,17,6,5,9};但如果采用插入方法建堆,得到的最大堆是A2={84,22,19,17,10,5,6,3,9}
b.
在最坏的情况下,A应该是一个依次增大的有序数组,则每次MAX-HEAP-INSERT操作的复杂度为Theta(lgi),一共n−1次插入操作,所以时间复杂度为
6-2
a.
求父节点下标:
PARENT(i)
1 return ⌊i/d⌋
求第k(1≤k≤d)个子节点下标:
CHILD(i, k)
1 return d⋅i+k−1
b.
含n个元素的
c.
EXTRACT_MAX(A)
1 if A.heap-size < 1
2 error "heap underflow"
3 max = A[1]
4 A[1] = A[A.heap-size]
5 A.heap-size = A.heap-size - 1
6 MAX-HEAPIFY(A,1)
7 return max
其中MAX-HEAPIFY(A,i)为:
MAX-HEAPIFY(A,i)
1 largest = i
2 for j = 1 to d
3 if CHILD(i,j) <= A.heap-size and A[j] > A[i]
4 largest = j
5 if largest 不等于 i
6 exchange A[i] with A[CHILD(i,largest)]
7 MAX-HEAPIFY(A, largest)
MAX-HEAPIFY函数的时间复杂度为O(lgdn),所以EXTRACT-MAX的时间复杂度也为O(lgdn)。
d.
INSERT(A, key)
1 A.heap-size = A.heap-size + 1
2 A[A.heap-size] = -infty
3 INCREASE-KEY(A, A.heap-size, key)
其中INCREASE-KEY(A, i, key)为:
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)] < A[i]
4 exchange A[i] with A[PARENT(i)]
5 i = PARENT(i)
6 A[i] = key
其中HEAP-INCREASE-KEY函数的复杂度为O(lgdn),所以INSERT函数的复杂度也为O(lgdn)
e.
INCREASE-KEY的实现如上题。时间复杂度为O(lgdn)
6-3
a.
b.
因为对一个m∗n的Young氏矩阵Y,每一行都从左到右排列,每一列都从上到下排列,所以第一行第一个,也就是Y[1,1]是整个矩阵最小的元素,最后一行最后一个,也就是Y[m,n]是整个矩阵最大的数。故如果Y[1,1]=∞,说明最小的数也为空,整个Y就为空;如果
c.
EXTRACT-MIN(Y)
1 min = Y[1, 1]
2 Y[1, 1] = infty
3 i = 1, j = 1
4 while true
5 if j < n and Y[i, j + 1] < Y[i, j]
6 exchange Y[i, j + 1] with Y[i, j]
7 j = j + 1
8 else if i < m and Y[i + 1, j] < Y[i, j]
9 exchange Y[i + 1, j] with Y[i, j]
10 i = i + 1
d.
INSERT(Y, key)
1 Y[m, n] = key
2 i = m, j = n
3 while true
4 if j > 1 and Y[i, j - 1] < Y[i, j]
5 exchange Y[i, j - 1] with Y[i, j]
6 j = j - 1
7 if i > 1 and Y[i - 1, j] < Y[i, j]
8 exchange Y[i - 1, j] with Y[i, j]
9 i = i - 1
e.
逐次使用EXTRACT-MIN函数从Y矩阵中取出最小数,一共需要进行
f.
COMPARE(Y, key)
1 i = m, j = 1
2 while true
3 if j < n and Y[i, j] < key
4 j = j + 1
5 else if Y[i, j] == key
6 return true
7 else if i > 1 and Y[i, j] > key
8 i = i - 1
9 return false