【问题标题】: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
  • 我认为它的分而治之我怀疑合并步骤也涉及一些数学。

标签: algorithm dynamic-programming greedy divide-and-conquer


【解决方案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 问题(单列)。
  • 铅笔和纸总是有帮助的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多