算法导论 — 思考题6-3 Young氏矩阵

Young氏矩阵)在一个 m × n m×n m×n的Young氏矩阵(Young tableau)中,每一行的数据都是从左到右排序,每一列的数据都是从上到下排序的。Young氏矩阵中也会存在一些值为 ∞ ∞ 的数据项,表示那些不存在的元素。因此,Young氏矩阵可以用来存储 r ≤ m n r ≤ mn rmn个有限的数。
  a. 画出一个包含元素为{9, 16, 3, 2, 4, 8, 5, 14, 12}的4×4 Young氏矩阵。
  b. 对于一个 m × n m×n m×n的Young氏矩阵 Y Y Y来说,请证明:如果 Y [ 1 , 1 ] = ∞ Y[1, 1] = ∞ Y[1,1]=,则 Y Y Y为空;如果 Y [ m , n ] &lt; ∞ Y[m, n] &lt; ∞ Y[m,n]<,则 Y Y Y为满(即包含 m n mn mn个元素)。
  c. 请给出一个在 m × n m×n m×n Young氏矩阵上时间复杂度为 O ( m + n ) O(m+n) O(m+n)的EXTRACT-MIN的算法实现。你的算法可以考虑使用一个递归过程,它可以把一个规模为 m × n m×n m×n的问题分解为规模为 ( m − 1 ) × n (m-1)×n (m1)×n或者 m × ( n − 1 ) m×(n-1) m×(n1)的子问题(提示:考虑使用MAX-HEAPIFY)。这里,定义 T ( p ) T(p) T(p)用来表示EXTRACT-MIN在任一 m × n m×n m×n的Young氏矩阵上的时间复杂度,其中 p = m + n p = m+n p=m+n。给出并求解 T ( p ) T(p) T(p)的递归表达式,其结果为 O ( m + n ) O(m+n) O(m+n)
  d. 试说明如何在 O ( m + n ) O(m+n) O(m+n)时间内,将一个新元素插入到一个未满的 m × n m×n m×n的Young氏矩阵中。
  e. 在不用其他排序算法的情况下,试说明如何利用一个 n × n n×n n×n的Young氏矩阵在 O ( n 3 ) O(n^3) O(n3)的时间内将 n 2 n^2 n2个数进行排序。
  f. 设计一个时间复杂度为 O ( m + n ) O(m+n) O(m+n)的算法,它可以用来判断一个给定的数是否存储在 m × n m×n m×n的Young氏矩阵中。
  
  
  a.
  在这里插入图片描述
  
  b.
  先给出Young氏矩阵的性质1:对于矩阵中的任意一个元素 Y [ i , j ] Y[i, j] Y[i,j],如果 i ′ ≤ i i&#x27;≤i ii并且 j ′ ≤ j j&#x27;≤j jj,那么一定有 Y [ i ′ , j ′ ] ≤ Y [ i , j ] Y[i&#x27;,j&#x27;]≤Y[i,j] Y[i,j]Y[i,j]。下面我们来证明这个性质。
  由于在同一行中,左边的元素不大于右边的元素,所以有 Y [ i ′ , j ′ ] ≤ Y [ i ′ , j ] Y[i&#x27;,j&#x27;]≤Y[i&#x27;,j] Y[i,j]Y[i,j] (因为 j ′ ≤ j j&#x27;≤j jj,所以 Y [ i ′ , j ′ ] Y[i&#x27;,j&#x27;] Y[i,j]位于 Y [ i ′ , j ] Y[i&#x27;,j] Y[i,j]的左边,或者二者是同一个元素)。又由于在同一列中,上边的元素不大于下边的元素,所以有 Y [ i ′ , j ] ≤ Y [ i , j ] Y[i&#x27;,j]≤Y[i,j] Y[i,j]Y[i,j](因为 i ′ ≤ i i&#x27;≤i ii,所以 Y [ i ′ , j ] Y[i&#x27;,j] Y[i,j] Y [ i , j ] Y[i,j] Y[i,j]的上边,或者二者是同一个元素)。综上所述,有 Y [ i ′ , j ′ ] ≤ Y [ i ′ , j ] ≤ Y [ i , j ] Y[i&#x27;,j&#x27;]≤Y[i&#x27;,j]≤Y[i,j] Y[i,j]Y[i,j]Y[i,j]。所以上述性质是成立的。
  类似地,可以得到另外一个性质2:对于矩阵中的任意一个元素 Y [ i , j ] Y[i, j] Y[i,j],如果 i ′ ≥ i i&#x27;≥i ii并且 j ′ ≥ j j&#x27;≥j jj,那么一定有 Y [ i ′ , j ′ ] ≥ Y [ i , j ] Y[i&#x27;,j&#x27;]≥Y[i,j] Y[i,j]Y[i,j]
  现在我们来看题目要求我们证明的结论。如果 Y [ 1 , 1 ] = ∞ Y[1, 1] = ∞ Y[1,1]=,那么根据性质2, Y Y Y中任意一个元素都满足 Y [ i , j ] ≥ Y [ 1 , 1 ] = ∞ Y[i, j] ≥Y[1, 1] = ∞ Y[i,j]Y[1,1]= (因为 i ≥ 1 i ≥ 1 i1并且 j ≥ 1 j ≥ 1 j1),即 Y Y Y中的所有元素都为 ∞ ∞ ,所以 Y Y Y为空。
  如果 Y [ m , n ] &lt; ∞ Y[m, n] &lt; ∞ Y[m,n]<,那么根据性质1, Y Y Y中任意一个元素都满足 Y [ i , j ] ≤ Y [ m , n ] &lt; ∞ Y[i, j] ≤ Y[m, n] &lt; ∞ Y[i,j]Y[m,n]< (因为 i ≤ m i ≤ m im并且 j ≤ n j ≤ n jn),即 Y Y Y中的所有元素都不为 ∞ ∞ ,所以Y为满。
  
  c.
  根据上文性质2,Young氏矩阵中的任意一个元素必然满足 Y [ i , j ] ≥ Y [ 1 , 1 ] Y[i, j] ≥ Y[1, 1] Y[i,j]Y[1,1],所以 Y [ 1 , 1 ] Y[1, 1] Y[1,1]一定是最小的元素。EXTRACT-MIN先将 Y [ 1 , 1 ] Y[1, 1] Y[1,1]取出,然后将 Y [ 1 , 1 ] Y[1, 1] Y[1,1]赋值为 ∞ ∞ ,这时 Y [ 1 , 1 ] Y[1, 1] Y[1,1]有可能破坏Young氏矩阵的性质,可以用类似MIN-HEAPIFY的方法来维护Young氏矩阵的性质。
  在这里插入图片描述
  YOUNG-MATRIX-EXTRACT-MIN中每次while迭代,要么让 i i i 1 1 1,要么让 j j j 1 1 1,最坏情况一直让 i i i加到 m m m并且 j j j加到 n n n为止。因此while迭代次数最多为 m + n m+n m+n。故YOUNG-MATRIX-EXTRACT-MIN的时间复杂度为 O ( m + n ) O(m+n) O(m+n)。下图给出了一个YOUNG-MATRIX-EXTRACT-MIN的例子。
  在这里插入图片描述
  
  d.
  根据b的结论,如果一个Young氏矩阵未满,那么 Y [ m , n ] Y[m, n] Y[m,n]一定为 ∞ ∞ 。将 Y [ m , n ] Y[m, n] Y[m,n]赋值为要插入的元素值,这样 Y [ m , n ] Y[m, n] Y[m,n]有可能违反Young氏矩阵的性质。然后采用类似最小堆的HEAP-DECREASE-KEY方法,来将 Y [ m , n ] Y[m, n] Y[m,n]交换到正确的位置。
  在这里插入图片描述
  YOUNG-MATRIX-INSERT的时间复杂度与YOUNG-MATRIX-EXTRACT-MIN一样,都为 O ( m + n ) O(m+n) O(m+n)。下图给出了一个YOUNG-MATRIX-INSERT的例子。
  在这里插入图片描述
  
  e.
  建立一个 n × n n×n n×n的Young氏矩阵,用INSERT将每一个元素依次插入矩阵中。每插入一个元素耗时 O ( n + n ) = O ( n ) O(n+n) = O(n) O(n+n)=O(n),一共有 n 2 n^2 n2个元素,因此插入所有元素耗时 O ( n 3 ) O(n^3) O(n3)。再调用EXTRACT-MIN依次提取出最小元素即可完成排序,这一步所花费的时间也为 O ( n 3 ) O(n^3) O(n3)
  
  f.
  假设要寻找的元素为 x x x。从Young氏矩阵左下角元素 Y [ m , 1 ] Y[m, 1] Y[m,1]开始搜索,分 3 3 3种情况:
  1) x &gt; Y [ m , 1 ] x &gt; Y[m, 1] x>Y[m,1]
  说明 x x x不可能出现在第 1 1 1列 (因为 Y [ m , 1 ] Y[m, 1] Y[m,1]为第 1 1 1列的最大元素),只可能出现在第 1 1 1列的右边,所以现在忽略第 1 1 1列,以第 2 2 2列的最后一个元素 Y [ m , 2 ] Y[m, 2] Y[m,2]作为新的左下角元素重新进行搜索。
  2) x &lt; Y [ m , 1 ] x &lt; Y[m, 1] x<Y[m,1]
  说明 x x x不可能出现在第 m m m行 (因为 Y [ m , 1 ] Y[m, 1] Y[m,1]为第 m m m行的最小元素),只可能出现在第 m m m行的上面,所以现在忽略第 m m m行,以第 m − 1 m-1 m1行的第一个元素 Y [ m − 1 , 1 ] Y[m-1, 1] Y[m1,1]作为新的左下角元素重新搜索。
  3) x = Y [ m , 1 ] x = Y[m, 1] x=Y[m,1]
  已经找到所需元素。
  按以上流程迭代,直到找到所需元素为止,或者直到新的左下角元素已经超出了Young氏矩阵的范围为止,这种情况说明矩阵中没有我们要找的元素。
  在这里插入图片描述
  很明显,YOUNG-MATRIX-SEARCH的时间复杂度也为 O ( m + n ) O(m+n) O(m+n)

本题的code链接。
  https://github.com/yangtzhou2012/Introduction_to_Algorithms_3rd/tree/master/Chapter06/Problem_6-3

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值