(Young氏矩阵)在一个
m
×
n
m×n
m×n的Young氏矩阵(Young tableau)中,每一行的数据都是从左到右排序,每一列的数据都是从上到下排序的。Young氏矩阵中也会存在一些值为
∞
∞
∞的数据项,表示那些不存在的元素。因此,Young氏矩阵可以用来存储
r
≤
m
n
r ≤ mn
r≤mn个有限的数。
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
]
<
∞
Y[m, n] < ∞
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
(m−1)×n或者
m
×
(
n
−
1
)
m×(n-1)
m×(n−1)的子问题(提示:考虑使用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'≤i
i′≤i并且
j
′
≤
j
j'≤j
j′≤j,那么一定有
Y
[
i
′
,
j
′
]
≤
Y
[
i
,
j
]
Y[i',j']≤Y[i,j]
Y[i′,j′]≤Y[i,j]。下面我们来证明这个性质。
由于在同一行中,左边的元素不大于右边的元素,所以有
Y
[
i
′
,
j
′
]
≤
Y
[
i
′
,
j
]
Y[i',j']≤Y[i',j]
Y[i′,j′]≤Y[i′,j] (因为
j
′
≤
j
j'≤j
j′≤j,所以
Y
[
i
′
,
j
′
]
Y[i',j']
Y[i′,j′]位于
Y
[
i
′
,
j
]
Y[i',j]
Y[i′,j]的左边,或者二者是同一个元素)。又由于在同一列中,上边的元素不大于下边的元素,所以有
Y
[
i
′
,
j
]
≤
Y
[
i
,
j
]
Y[i',j]≤Y[i,j]
Y[i′,j]≤Y[i,j](因为
i
′
≤
i
i'≤i
i′≤i,所以
Y
[
i
′
,
j
]
Y[i',j]
Y[i′,j]在
Y
[
i
,
j
]
Y[i,j]
Y[i,j]的上边,或者二者是同一个元素)。综上所述,有
Y
[
i
′
,
j
′
]
≤
Y
[
i
′
,
j
]
≤
Y
[
i
,
j
]
Y[i',j']≤Y[i',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'≥i
i′≥i并且
j
′
≥
j
j'≥j
j′≥j,那么一定有
Y
[
i
′
,
j
′
]
≥
Y
[
i
,
j
]
Y[i',j']≥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
i≥1并且
j
≥
1
j ≥ 1
j≥1),即
Y
Y
Y中的所有元素都为
∞
∞
∞,所以
Y
Y
Y为空。
如果
Y
[
m
,
n
]
<
∞
Y[m, n] < ∞
Y[m,n]<∞,那么根据性质1,
Y
Y
Y中任意一个元素都满足
Y
[
i
,
j
]
≤
Y
[
m
,
n
]
<
∞
Y[i, j] ≤ Y[m, n] < ∞
Y[i,j]≤Y[m,n]<∞ (因为
i
≤
m
i ≤ m
i≤m并且
j
≤
n
j ≤ n
j≤n),即
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
>
Y
[
m
,
1
]
x > 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
<
Y
[
m
,
1
]
x < 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
m−1行的第一个元素
Y
[
m
−
1
,
1
]
Y[m-1, 1]
Y[m−1,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