算法导论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})\)

posted @ 2021-01-15 10:34  ijkzen  阅读(208)  评论(0编辑  收藏  举报