算法导论: 第6章
6-2 对d叉堆的分析
a)用A[1]表示根,则其儿子为A[2]到A[d+1],其孙子为A[d+2]到A[d^2+d+1],以此类推。所以有
d-parent(i):
return [(i-2)/d + 1] (方括号表示下取整)
d-child(i,j):
return d(i-1) + j + 1
b)由于每个节点有d个儿子,所以含n个元素的d叉堆的高度为O(logdn) = O(lgn/lgd)。
c)由于输出最大值后的调整,需要从d个儿子中选出最大的,故每层的调整都需要d次,有logdn层,故为O(d*logdn)。
d)树的高度,为O(logdn)。
e)跟插入一样,为O(logdn)。
6-3 Young氏矩阵
c) 提取出最小元素后,需要有一个调整过程。将下方或者右方较小的元素提上来放到A[1,1]处,然后接着调整。所以有T(m,n) = T(m-1,n)|T(m,n-1) + 1。最坏是m和n每次都轮流减1,即为O(m+n)。
d)插入元素后,将它跟左方以及上方的元素比较,跟较大的那个交换。重复之,直到没有左方或者上方的元素比它大。很显然,还是 O(m+n)
e)建立矩阵,需要不断插入n^2个元素,复杂度为2n^3,然后不断Extract-min即可。
f)总是与最右上角比较,如果等于,则返回。
如果大于,去除右上角元素所在的这一行。
如果小于,去除右上角元素所在的这一列。