6-1
a.不一样。当输入数据为1,2,3时,bulid_max_heap产生的堆为:3,2,1
本题中给出的代码产生的数据为:3,1,2
b.每次插入数据最多耗时 O ( l g n ) O(lgn) O(lgn),一共要执行n次,总的复杂度为 O ( n l g n ) O(nlgn) O(nlgn).
6-2
a.
类似书中的给出求i节点的父节点和第j个孩子节点的下标计算公式,如下:
父节点:
i
n
t
(
(
i
−
2
)
/
d
+
1
)
int((i-2)/d+1)
int((i−2)/d+1)
第j个孩子节点:
d
∗
(
i
−
1
)
+
j
+
1
d*(i-1)+j+1
d∗(i−1)+j+1
其中d为每个节点的孩子数。
b.
每个节点有d个孩子,那么n个节点的d叉树高度为
l
o
g
d
n
log_dn
logdn.
c.
def exchange(a,b):
return b,a
def d_heap_extract_max(A):
if A.heap_size<1:
return False
largest=A[1]
A[1]=A[A.heap_size]
A.heap_size-=1
d_max_heapify(A,1)
return largest
def max_heapify(A,i)
largest=i
for k in range(1,d):
if d_child(k.i)<= A.heap_size and A[d_child(k,i)>A[i]]:
if A[d_child(k,i)>largest]:
largest=A[d_child(k,i)]
if largest !=i:
A[i],A[largest]=exchange (A[i], A[largest])
d_max_heapify(A,largest)
d.
def d_max_insert(A,key):
A.heap_size-=1
A[A.heap_size]=key
i=A.heap_size
while i>1 and A[d_parent(i)<A[i]]:
A[i],A[d_parent(i)]=exchange(A[i],A[d_parent(i)])
i=d_parent(i)
6-3
a.
2,3,4,5
8,9,12,14
16,inf,inf,inf
inf,inf,inf,inf
b.
根据定义,一个m*n的young矩阵的第一个元素是矩阵中最小的元素,而Y[m,n]是最大的元素,所以得证。
c.
将第一个元素储存下来后,并在矩阵中将其值改为无穷,通过比较周围的元素大小来交换元素,直到它是最小的结束。
d.
算法和前面的类似,从矩阵的右下角开始,向上和向左移动直到正确的位置。