将有序事件序列合并到表中

时间:2018-06-20 23:39:21

标签: algorithm computer-science

我正在寻找一种解决以下问题的算法:说我有一个有序事件序列的集合,并希望从中创建表

AB
BC

指向表格的表格

ABC
**
 **

第一行是标题。对于每个输入序列,我希望在发生的事件的列中带有标记的行。

另一个更复杂的示例(包含三个序列)将是:

AAB
BBA
CBA

导致

CBBAAB
   ***
 ***  
** *

我知道有时候有多种可能的解决方案(例如,两个序列仅包含一个事件的琐碎示例,我可以自由决定哪个是第一个)。我只对任何解决方案感兴趣,生成的标头序列(在上一个示例中为CBBAAB)应尽可能短。

有人知道解决该问题的算法吗?

2 个答案:

答案 0 :(得分:1)

原来,我要在此处解决的问题称为(多个)sequence alignment。这在生物信息学中非常普遍(他们正在使用它来比较DNA字符串)。有很多用于DNA序列比对的工具,但是通用工具的数量似乎非常有限。

GitHub上的

noporpoise/seq-align似乎很有希望。我将不得不围绕它构建一些工具以使其适应我的目的。我的序列元素是多个字符,但是由于我没有那么多,所以我可以将它们映射到ASCII字符。而且该工具仅执行成对序列比对,因此我将不得不链接调用。为了找到最佳解决方案,我必须对每个可能的链(生成所有排列)执行该解决方案。

答案 1 :(得分:1)

我相信可以用更简单的方法解决它。在我看来,这个问题似乎是先找到最短的公共超序列,然后再寻找标记-计算具有超序列的每个字符串的公共子序列。

例如:

AAB

BBA

CBA

AAB, BBA之间最短的常见超序是BBAABAABBA 那么BBAABCBA之间的最短超序为CBBAABAABBACBA之间的最短超序为CAABBA

现在要找到AAB的标记,找到CBBAABAAB之间的公共子序列。 对于BBACBBAAB以及CBACBBAAB

以下一些链接可帮助您找到它们:

Shortest common supersequence

Longest common subsequence