我正在寻找一种解决以下问题的算法:说我有一个有序事件序列的集合,并希望从中创建表
AB
BC
指向表格的表格
ABC
**
**
第一行是标题。对于每个输入序列,我希望在发生的事件的列中带有标记的行。
另一个更复杂的示例(包含三个序列)将是:
AAB
BBA
CBA
导致
CBBAAB
***
***
** *
我知道有时候有多种可能的解决方案(例如,两个序列仅包含一个事件的琐碎示例,我可以自由决定哪个是第一个)。我只对任何解决方案感兴趣,生成的标头序列(在上一个示例中为CBBAAB
)应尽可能短。
有人知道解决该问题的算法吗?
答案 0 :(得分:1)
原来,我要在此处解决的问题称为(多个)sequence alignment。这在生物信息学中非常普遍(他们正在使用它来比较DNA字符串)。有很多用于DNA序列比对的工具,但是通用工具的数量似乎非常有限。
GitHub上的noporpoise/seq-align似乎很有希望。我将不得不围绕它构建一些工具以使其适应我的目的。我的序列元素是多个字符,但是由于我没有那么多,所以我可以将它们映射到ASCII字符。而且该工具仅执行成对序列比对,因此我将不得不链接调用。为了找到最佳解决方案,我必须对每个可能的链(生成所有排列)执行该解决方案。
答案 1 :(得分:1)
我相信可以用更简单的方法解决它。在我看来,这个问题似乎是先找到最短的公共超序列,然后再寻找标记-计算具有超序列的每个字符串的公共子序列。
例如:
AAB
BBA
CBA
AAB, BBA
之间最短的常见超序是BBAAB
或AABBA
那么BBAAB
和CBA
之间的最短超序为CBBAAB
或AABBA
和CBA
之间的最短超序为CAABBA
现在要找到AAB
的标记,找到CBBAAB
和AAB
之间的公共子序列。
对于BBA
和CBBAAB
以及CBA
,CBBAAB
以下一些链接可帮助您找到它们: