您的位置:首页 > 其它

算法导论第三版习题6.5

2016-02-28 14:08 381 查看

6.5-1

(a) 首先直接提取max=A[1]=15max = A[1] = 15;

(b) 然后令A[1]=A[heap_size]=1A[1]=A[heap\_size]=1,让heap_size=heap_size−1heap\_size=heap\_size-1,此时堆A为A={1,13,9,5,12,8,7,4,0,6,2}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]\lt A[3]\lt A[2],故调换A[1]和A[2]A[1]和A[2]得到A′={13,1,9,5,12,8,7,4,0,6,2}A^{'}=\{13,1,9,5,12,8,7,4,0,6,2\};

(d) 接着继续调换A[2]和A[5]A[2]和A[5]得到A′′={13,12,9,5,1,8,7,4,0,6,2}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}A[5]和A[10]得到A^{'''}=\{13,12,9,5,6,8,7,4,0,1,2\};

(f) 最后返回maxmax。

6.5-2

(a) 首先增加A的堆长,令A.heap_size=A.heap_size+1=13A.heap\_size=A.heap\_size+1=13,并且令A[13]=−∞A[13]=-\infty;

(b) 然后令A[13]=10A[13]=10,由于A[13]>A[6]A[13]\gt A[6],故交换A[6]和A[13]A[6]和A[13],得到A′={15,13,9,5,12,10,7,4,0,6,2,1,8}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[3] \lt A[6],故交换A[6]和A[3],得到A^{''}=\{15,13,10,5,12,9,7,4,0,6,2,1,8\},A′′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是最大堆,将关键字设为−∞-\infty,在将元素插入后,整个堆仍然是最大堆,然后才能利用HEAP-INCREASE-KEY(A, A.heap-size, key)。

6.5-5

初始化:第一次调用开始时,因为A原本就是最大堆,A的所有子树都是最大堆。由于key>A[i]key\gt A[i],所以我们已经令A[i]=keyA[i]=key,子树AA[i..A.heap−size]A[i..A.heap{-}size]还是满足最大堆性质。此时若A[PARENT(i)>A[i]A[PARENT(i)>A[i],则子数组A[1..A.heap−size]A[1..A.heap{-}size]显然还是最大堆,否则就是A[i]>A[PARENT(i)]A[i]>A[PARENT(i)];

保持:在每次循环开始前,子树A[i..A.heap−size]A[i..A.heap{-}size]都是最大堆,若A[PARENT(i)]>A[i]A[PARENT(i)]>A[i],则子数组A[1..A.heap−size]A[1..A.heap{-}size]满足最大堆性质,否则就是A[i]>A[PARENT(i)A[i]>A[PARENT(i);

终止:i=2或3时,PARENT(i)=1i=2或3时,PARENT(i)=1,若A[i]<A[1]A[i],因为A[i..A.heap−size]A[i..A.heap{-}size]就是一个最大堆,此时整个数组就是一个最大堆;否则就是A[i]<A[1]A[i],交换A[i]和A[1]后,A[1..A.heap−size]A[i]和A[1]后,A[1..A.heap{-}size]整个就是最大堆了。

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)O(k);

(2)

通过HEAP-EXTRACT-MIN函数取出最小元素,时间复杂度是O(lgk)O(lgk),然后再从这个被取出的元素的原先所在的那个有序链表中取出最小元素(除非该链表已经为空,此时省略插入到堆的操作),用MIN-HEAP_INSERT函数插入到堆中,时间复杂度也是O(lgk)O(lgk),所以这一步总的时间复杂度是O(lgk)O(lgk);

(3)

一共有nn个元素,需要重复执行第二步n−kn-k次,故步骤2和步骤3一共时间复杂度为O[(n−k)lgk]O[(n-k)lgk]。总的复杂度就是O(k)+O[(n−k)lgk]O(k)+O[(n-k)lgk],所以复杂度为O(nlgk)O(nlgk)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: