以下问题取自Problems on Algorithms (Problem 653):
你得到一个数字矩阵。找到一个 O(n log n) 算法,该算法对数组中的行进行置换,使得数组的任何一列都不包含比 ⌈√n 长的递增子序列(可能不包含连续的数组元素)。⌉
我不知道如何解决这个问题。我认为它可能会使用某种分而治之的重复,但我似乎找不到。
有谁知道如何解决这个问题?
以下问题取自Problems on Algorithms (Problem 653):
你得到一个数字矩阵。找到一个 O(n log n) 算法,该算法对数组中的行进行置换,使得数组的任何一列都不包含比 ⌈√n 长的递增子序列(可能不包含连续的数组元素)。⌉
我不知道如何解决这个问题。我认为它可能会使用某种分而治之的重复,但我似乎找不到。
有谁知道如何解决这个问题?
这是我的解决方案。
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⌉组)