完全学自.https://en.wikipedia.org/wiki/Needleman%E2%80%93Wunsch_algorithm
还有内容会更新补充
编者按:
比对其实应该对应的单词是alignment,但往往特指低通量的序列之间的比较。比如10条序列,进行多序列比对就是我们常说的 multiple alignment问题;如果是2条序列的比对,我们经常称其为pairwise alignment.
mapping,一般指高通量的数据去寻找基因组的位置。比如我们进行测序以后,有10M对read pair,要去寻找他们在基因组上的位置,这个时候就是一个典型的mapping问题。
alignment与mapping其实是密切相关的概念,所有的mapping软件其实都是从低通量的办法逐步改进而得到的。
算法简述:
1.需要的配置
-
一个配比矩阵
-
还需要一个得分系统:
match,mismatch,gap,连续gap。这些情况对应的分值
2.算法书写
3.具体的语言表述
将需要比较的俩列序列,列矩阵一样表现出来。然后依次给每个空格填入分数,即上文的F(i,j)。
-
F(i,j)的值如果来源于左边的加上gap的分,就是说这个位置的对应的Xi对应Y序列的gap了。
-
F(i,j)的值如果来源于上边的加上gap的分,就是说这个位置的对应的Yj对应X序列的gap了。
-
F(i,j)的值如果来源于左上边的加上match或者mismatch的分,就是说这个位置的对应的Xi对应Yj了。
也就是说,回溯确定序列如何分布时,是被这个分的由来得到的。也就是说,回溯仅能从这个分得到的方向回溯回去。
一些有意思的相关:
序列对齐也是可以采用枚举的方法,当然这个方式一听就很可怕。
两个n长的序列,新的匹配结果能且只能通过插入空位产生,因此最极端的情况无非就是所有残基都与空位对应。
动态规划就是用上个局部最优解加上这个部分的局部最优解,从而得到全局最优解。
一个疑惑:如何保证让局部最优解相加得到全局最优解。