【问题标题】:Shortest Sub-sequence Time Complexity最短子序列时间复杂度
【发布时间】:2015-04-18 06:54:28
【问题描述】:

如果我们有两个字母序列 X= 和 Y=。我们想找到最短的序列,使得 X 和 Y 成为该序列的子序列。这项工作的时间复杂度是多少?

1) O(nm)

2) O(n+m)

3) O((n+m)log(n+m))

我的解决方案:我找到了一种动态编程方式并使用 O(nm) 顺序。任何想法更好的解决方案?

感谢任何人

【问题讨论】:

  • 它们必须成为子序列还是子字符串?您的文本建议子序列,您的标签建议子字符串。
  • 如果您有 GHIJK 和 KLMNOP,那么答案将是 GHIJKLMNOP?
  • 亲爱的@IVlad,子序列...
  • abcdebd 的预期输出是 abcde 那么?

标签: algorithm data-structures dynamic-programming


【解决方案1】:

您可以将此问题简化为查找最长公共子序列 (LCS)。

给定两个序列及其最长的公共子序列,您可以使用类似合并的贪心算法在线性时间内构造最短的超序列,该算法将 X 或 Y 中的字母添加到如果它们从公共子序列中丢失,则结果,并前进到下一个字母。证明这个算法产生最短的超序列是微不足道的,因为否则它将与我们使用最长公共子序列的断言相矛盾。

由于没有一个 LCS 解决方案是线性的,因此解决 LCS 也将主导用于寻找该问题答案的算法。 LCS 解决方案的复杂性取决于几个因素,例如字母表的长度。

A solution to the general LCS is O(n*m).

固定字母表上 LCS 的解决方案是O((n+m+c)*long(n+m)),其中c 是公共子序列的长度。

【讨论】:

  • 能否请您谈谈您对cs.nyu.edu/courses/fall14/CSCI-GA.1170-001/hw/hw7.pdf 的看法,问题(2) 的b 部分说O(mn)?我认为这是最好的时间复杂度?我说的对吗?
  • @AliMovagher 是的,假设没有进一步的限制,你能做的最好是 O(m*n)。
猜你喜欢
  • 2019-03-07
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多