和上一回的算法相比,这是一个更加注重局部比对的算法,返回的是一段对比度最高的序列。其最精彩之处就在于引入了0这一可能,这样在任何时候,序列比较都能从当前位置从头开始,从而实现局部性。
为了能更有效率地完成回溯,在给矩阵打分时将打分结果记录在了几个数组中,并且在回溯时使用这几个数组加速过程。
这次写又掌握了numpy的许多新功能,比如zip、around、arange等等。具体用法可以看下面的代码。其中L矩阵是直接比对的情况,P是对seq2加空格比对的情况,Q是对seq1加空格比对的情况。
import numpy as np
# 对任意两个字符进行比较
def compare(m, n, match, n_match):
if m == n:
return match
else:
return n_match
#构建打分矩阵
def mark(seq1, seq2, match, n_match, v, u):
"用来生成最终的打分矩阵,传入形参分别为两个序列和匹配罚分、错配罚分、空位设置罚值,空位扩展罚值(出现空位的罚值为v+u*k)"
a = len(seq1)
b = len(seq2)
# 初始化打分矩阵
S = np.zeros((a + 1, b + 1))
# 顺序匹配的情况
L = np.zeros((a + 1, b + 1))
# 序列1产生若干空位情况
P = np.zeros((a + 1, b + 1))
# 序列2产生若干空位情况
Q =