【问题标题】:Arrange strings for maximum overlap排列字符串以获得最大重叠
【发布时间】:2013-08-07 18:01:24
【问题描述】:

假设我有这组字符串:

strings = {'qqq', 'eqq', 'qqw', 'www', 'qww', 'wwe', 'eee', 'eeq', 'wee', 'qwe'}

如何编写一个算法来排列字符串以使它们最大程度地重叠?我已经知道一种排列方式如下:

qww
 www
  wwe
   wee
    eee
     eeq
      eqq
       qqq
        qqw
         qwe

但是,我通过蛮力解决方案找到了上述结果。有更聪明的方法吗?

【问题讨论】:

  • 这看起来像是来自 Rosalind.info 的内容。
  • 只是想了想:以字符串为顶点、以边为重叠量的图形。进行图遍历以找到包括具有最大成本的所有顶点的最短路径?
  • @Bill 我以前从未听说过这个,但我确实意识到,当我研究这个时,它有点类似于匹配 DNA 序列。对于真正想知道的人来说,这与游戏 Dota 2 中的一个叫 Invoker 的英雄有关。他可以同时激活 3 个球体(q、w 或 e),并且他可以使用他的活跃球体来调用一个法术基于他的球体组合。这是为了计算出调用所有 10 个法术所需的最少击键次数。
  • @Lanaru:正如 Peter de Rivaz 的回答所暗示的,这个问题是 NP 完全的,所以如果你需要一个完美的答案,你的蛮力算法已经是最优的了。但是由于您的问题空间很小(2^N=1024),谁在乎呢?

标签: python algorithm overlap


【解决方案1】:

这称为最短超弦问题,是 NP 完全问题。

您可能对Approximation Algorithms for the Shortest Common Superstring Problem by Jonathan Turner 论文中的方法感兴趣。

【讨论】:

  • 感谢您的回答。发现您在自己的时间偶然发现的问题已经被分析和研究过,这总是很有趣。我目前正在攻读软件工程学士学位,所以我想我可以运用我的知识来提出一个聪明的解决方案(优化问题解决,或动态编程之类的)。然后我放弃了,而是采用了蛮力方法。很高兴看到问题没那么简单!
  • 如果您想要一个有趣的挑战,那么请尝试考虑一种算法,看看是否可以将所有字符串连接在一起,以便每一对重叠一个字符。这个修改后的问题有一个非常好的有效解决方案:)
  • “信息与计算”(DOI 10.1016/0890-5401(89)) 中长达 20 页的文章的链接看起来已经过时了。
  • 还有这个Wikipedia page NP-complete 定义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多