我正在编写一个Sublime Text脚本来对齐几行代码。该脚本采用每一行,通过一组预定义的分隔符(,;:=
)对其进行拆分,并将其重新加入,并将“每个”段中的每个段填充到相同的宽度。当所有行都有相同的分隔符集时,这种方法很有效,但有些行可能有额外的段,最后是可选的逗号,等等。
我的想法是想出一个规范的分隔符列表。具体来说,给定几个分隔符串,我想找到最短的字符串,它可以仅使用插入从任何给定字符串形成,并以一些合理的方式打破绑定。经过一些研究,我了解到这是全局多序列比对的众所周知的问题,除了没有不匹配,只有匹配和插入。
不幸的是,动态编程方法在字符串数量上是指数级的 - 至少在一般情况下如此。当不允许不匹配时,是否有希望获得更快的解决方案?
答案 0 :(得分:1)
我甚至犹豫不决,即使不允许不匹配,也没有这样的希望,但是我很确定没有 。这就是原因。
执行序列对齐时生成的动态编程表的大小大约是(字符串长度)^(字符串数),因此是指数运行时/空间要求。为了让您了解它的来源,这里有一个带有两个字符串ABC ABC和ACB的示例,每个字符串长度为3.这为我们提供了一个3x3表格:
A B C
A 0 1 2
C 1 1 1
B 2 1 2
我们从左上角开始初始化此表,然后从那里开始向右下方。到达表中任何位置的总成本由该位置的数字给出(为简单起见,我假设插入,删除和替换的成本均为1)。用于到达给定位置的操作由您从前一个值移动的方向给出。向右移动意味着您要从顶部字符串插入元素。向下移动从侧向字符串插入元素。沿对角线移动意味着您要从顶部和底部对齐元素。如果这些元素不匹配,那么这代表了替代,并且您增加了到达那里的成本。
这就是问题所在。 说不允许不匹配并不排除负责表格长度和高度的操作(插入/删除)。更糟糕的是,不允许不匹配甚至不排除可能的举动。表中的对角线移动有时仍然存在,只是在两个元素不匹配时才会出现。此外,您仍然需要检查元素是否匹配,因此您基本上仍在考虑此举。因此,这不应该能够改善您的最坏情况时间,并且似乎不太可能对您的平均或最佳案例时间产生实质性影响。
从好的方面来说,这是生物信息学中一个非常重要的问题,因此人们提出了一些解决方案。它们有它们的缺陷,但可能对你的情况有效(特别是因为你似乎不太可能进行虚假对齐而不是DNA,因为你的字符串不是由四个组成的 - 字母表)。所以看一下Star Alignment和Neighbor Joining。