6

以下问题取自Problems on Algorithms (Problem 653):

你得到一个数字矩阵。找到一个 O(n log n) 算法,该算法对数组中的行进行置换,使得数组的任何一列都不包含比 ⌈√n 长的递增子序列(可能不包含连续的数组元素)。⌉

我不知道如何解决这个问题。我认为它可能会使用某种分而治之的重复,但我似乎找不到。

有谁知道如何解决这个问题?

4

1 回答 1

5

这是我的解决方案。

1) 根据第一个元素从大到小对行进行排序。

1 6    5 1
3 3 -\ 3 3
2 4 -/ 2 4
5 1    1 6

2)将它分成⌈√n⌉组,剩下的(不超过⌈√n⌉组)

5 1    5 1
3 3 -\ 3 3
2 4 -/ 
1 6    2 4
       1 6

3)根据第二个元素从大到小对每组中的行进行排序

5 1    3 3
3 3    5 1
    -> 
2 4    1 6
1 6    2 4

正确性证明:

第 1 列中增加的子序列只能在单个组中发生(大小为 <= ⌈√n⌉),

第2列递增子序列中没有2个元素在同一组(不超过⌈√n⌉组)

于 2011-08-31T09:41:15.520 回答