代码改变世界

算法导论-堆排序习题解

2012-02-10 14:26  meteorgan  阅读(437)  评论(0编辑  收藏  举报

6.1-7 证明:当数组表示存储了n个元素的堆时,叶子节点的下标是n/2+1, n/2+1, ……,n

  解:最后一个叶子节点n,其父节点是n/2,在n/2后所有节点都是叶子节点,否则其子节点必大于n。

6.5-8 请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的个数。(提示:用一个最小堆来作k路合并)

  解:1. 建立一个k个元素的最小堆,堆中每个元素为一个链表,元素的key为链表中第一个元素的key。

         2. 不断删除根节点元素,加入到新链表,然后用根节点所指的链表中的第二个元素代替第一个元素,执行min_heapify操作。

              3. 当最小堆为空时,得到新的排序链表。

6-3 Young 氏矩阵

  解:a) 略

    b) Y[1,1] 是最小元素,若为空,则Y为空。Y[m,n]是最大元素,如不为空,则Y满。

         c) 若Y[1,2] >= Y[2,1],用Y[2,1]代替Y[1,1];若Y[1,2] < Y[2,1],用Y[1,2]代替Y[1,1]。依照这种方法递归解决(m-1)*n 或 m*(n-1)问题。每次可以排除一行或一列元素。 递归式:T(p) = 1 + T(p-1)。

         d) 将新元素加到最后一个非空元素的后一个位置,比较左边和上边元素的大小。然后交换最大元素和新元素。递归这个过程即可。

    e) 利用c)中方法获得一个最小元素时间为O(n),n2 个元素总时间为O(n3)。

         f)  将给定数与矩阵左下角元素(该元素为它所在列的最大值,所在行的最小值)相比,每次可以排除一行或一列。时间复杂度为O(m+n)。