多序列比对(最长公共子序列)?

时间:2012-04-09 13:00:22

标签: python objective-c perl lcs sequence-alignment

好的,这就是我想要做的事情:

获取两个以上的字符串并“对齐”它们(没有DNA / RNA序列等,只是常规字符串,每个字符串不包含1000个项目)

我已经完成了成对对齐(对齐两个字符串)的一些工作,但是当尝试对齐多个对时,“间隙”会给我带来一些问题。

示例(我正在测试的一个)

ABCDEF
ABGHCEEF
AJKLBCDYEOF

AB--CDEF
ABGHCEEF
=======================
AB--C-EF

A-B--C--E-F
AJKLBCDYEOF
=======================
A----C--E-F

另一个(更具说明性)的例子:

http://nest.drkameleon.com
http://www.google.com
http://www.yahoo.com

http://nest.drkameleon.com
http://-www.--google--.com

=======================
http://----.------le--.com

http://----.------le--.com
http://-www.-----yahoo.com

=======================
http://----.----------.com

我目前正在做的事情:

  • 对字符串进行排序(较长的字符串在列表中排在第一位)
  • 对齐第一对:A-B并得到结果(让我们说R1
  • 然后对齐第二对:R1C(结果为R2
  • 然后对齐第三对:R2D
  • 依旧......

那么你的想法是什么?我怎么能这样做?有没有更好的办法? (当然,必须有...)

我宁愿在Perl / Python中执行此操作,也可以使用这些内容,但是任何类型的代码/引用都会受到欢迎! : - )

2 个答案:

答案 0 :(得分:1)

我认为您可以将此问题转换为更常规的字符串 diff 问题,而不是字符串 alignment 。考虑如何使用GNU diff来查找两个文件之间的差异,并使用与用于执行N路diff的算法相同的算法。

我不确定这种方法的时间/内存复杂性是否适合您的需求,但您至少可以这样思考问题。

答案 1 :(得分:1)

有一种基于Levenshtein算法的算法来计算最长的公共序列,并带有可选的空格。不确定这是否有帮助。