算法导论第三版第六章思考题

来源:互联网 发布:h5小游戏网站源码 编辑:程序博客网 时间:2024/06/05 04:40

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),一共n1次插入操作,所以时间复杂度为

i=2nlgi=lg(n!)=Θ(nlgn)

6-2

a.

求父节点下标:
PARENT(i)
1 return i/d
求第k(1kd)个子节点下标:
CHILD(i, k)
1 return di+k1

b.

n个元素的d叉堆高度是lgdn

c.

EXTRACT_MAX(A)1 if A.heap-size < 12   error "heap underflow"3 max = A[1]4 A[1] = A[A.heap-size]5 A.heap-size = A.heap-size - 16 MAX-HEAPIFY(A,1)7 return max

其中MAX-HEAPIFY(A,i)为:

MAX-HEAPIFY(A,i)1 largest = i2 for j = 1 to d3   if CHILD(i,j) <= A.heap-size and A[j] > A[i]4     largest = j5 if largest 不等于 i6   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 + 12 A[A.heap-size] = -infty3 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.

251238144916

b.

因为对一个mn的Young氏矩阵Y,每一行都从左到右排列,每一列都从上到下排列,所以第一行第一个,也就是Y[1,1]是整个矩阵最小的元素,最后一行最后一个,也就是Y[m,n]是整个矩阵最大的数。故如果Y[1,1]=,说明最小的数也为空,整个Y就为空;如果Y[m,n]<,说明最大的数也存在,故Y为满的。

c.

EXTRACT-MIN(Y)1 min = Y[1, 1]2 Y[1, 1] = infty3 i = 1, j = 14 while true5   if j < n and Y[i, j + 1] < Y[i, j]6     exchange Y[i, j + 1] with Y[i, j]7     j = j + 18   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

T(p)的递归表达式为:

T(p)=T(p1)+O(1)=O(p)=O(m+n)

d.

INSERT(Y, key)1 Y[m, n] = key2 i = m, j = n3 while true4   if j > 1 and Y[i, j - 1] < Y[i, j]5     exchange Y[i, j - 1] with Y[i, j]6     j = j - 17   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矩阵中取出最小数,一共需要进行n2次,每次时间复杂度为O(n+n)=O(n),所以总的算法时间复杂度为O(n3)

f.

COMPARE(Y, key)1 i = m, j = 12 while true3   if j < n and Y[i, j] < key4     j = j + 15   else if Y[i, j] == key6     return true7   else if i > 1 and Y[i, j] > key8     i = i - 19 return false
0 0
原创粉丝点击