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

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 < 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.

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] = 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

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

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

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 矩阵中取出最小数,一共需要进行n2次,每次时间复杂度为 O(n+n)=O(n) ,所以总的算法时间复杂度为 O(n3)

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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值