排列数组中的行以消除增加的子序列
Posted
技术标签:
【中文标题】排列数组中的行以消除增加的子序列【英文标题】:Permuting rows in an array to eliminate increasing subsequences 【发布时间】:2011-11-07 03:25:12 【问题描述】:以下问题取自Problems on Algorithms(问题653):
给你一个 n x 2 的数字矩阵。找到一个 O(n log n) 算法,该算法对数组中的行进行置换,使得数组的任何一列都不包含长于 ⌈√n 的递增子序列(可能不包含连续的数组元素)。⌉
我不确定如何解决这个问题。我认为它可能会使用某种分而治之的循环,但我似乎找不到。
有人知道如何解决这个问题吗?
【问题讨论】:
长于n的平方根? 是《算法问题》一书中的653题 这里是本书pdf的链接:larc.unt.edu/ian/books/free/license.html 我认为它的分而治之我怀疑合并步骤也涉及一些数学。 【参考方案1】:这是我的解决方案。
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 列的子序列增加只能在单个组中发生(大小为
第2列递增子序列中没有2个元素在同一组(不超过⌈√n⌉组)
【讨论】:
啊,太简单了。为什么我没看到?干得好。 大约 5 分钟。我开始思考如何解决 1xn 问题(单列)。 铅笔和纸总是有帮助的。以上是关于排列数组中的行以消除增加的子序列的主要内容,如果未能解决你的问题,请参考以下文章