算法导论6-2
读书笔记
本小节主要讲述了将一个数组变成最大堆的过程;
事实上还是比较简单的,这里使用了递归的方法;
分解
将堆分为左堆和右堆
解决
递归地将左堆和右堆变成最大堆
合并
合并左堆和右堆变成整体的最大堆
课后习题
6.2-1
参照图6-2的方法,说明\(MAX-HEAPIFY(A, 3)\)在数组\(A=<27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4,8, 9, 0>\)上的操作过程。
这个还是很简单的,但是画图太累了,略
6.2-2
参考过程\(MAX-HEAPIFY\),写出能够维护相应最小堆的\(MIN-HEAPIFY(A, i)\)的伪代码,并比较两者的运行时间。
MIN-HEAPIFY(A, i)
l = LEFT(i)
r = RIGHT(i)
if l <= A.heap-size and A[l] < A[i]
largest = l
else largest = i
if r <= A.heap-size and A[r] < A[largest]
largest = r
if largest != i
exchange A[i] with A[largest]
MIN-HEAPIFY(A, largest)
运行时间应该是一致的。
6.2-3
当元素\(A[i]\)比其子节点的值都大时,调用\(MAX-HEAPIFY(A, i)\)会有什么结果?
因为\(A[i]\)已经是子树中的最大值,所以不会有任何变化。
6.2-4
当\(i>A.heap-size/2\)时,调用\(MAX-HEAPIFY(A, i)\)会有什么结果?
其子结点的序号超出了堆的大小,程序将视为其子结点不存在,所以不会进行堆化操作。
6.2-5
\(MAX-HEAPIFY\)的代码效率较高,但第10行中的递归调用可能例外,它可能使某些编译器产生低效的代码。请用循环控制结构取代递归,重写\(MAX-HEAPIFY\)代码。
MAX-HEAPIFY (A, i)
while i < A.HEAPSIZE
left = LEFT(i)
right = RIGHT(i)
if left < A.HEAPSIZE && A[left] > A[i]
max_index = left
else
max_index = i
if right < A.HEAPSIZE && A[right] > A[max_index]
max_index = right
if max_index != i
exchange A[max_index] and A[i]
else
return;
6.2-6
证明: 对一个大小为\(n\)的堆,\(MAX-HEAPIFY\)的最坏情况运行时间为\(\Omega(\lg{n})\)。(提示:对于\(n\)个节点的堆,可以通过对每个节点设定恰当的值,使得从根节点到叶节点路径上的每个节点都会递归调用\(MAX-HEAPIFY\)。)
最坏情况就是从根节点一直调用到叶子节点,也就是树高\(\lg{n}\),所以最坏运行时间为\(\Omega(\lg{n})\)。