Smith Waterman局部比对 - spiralkernelle/bioinfo-wiki GitHub Wiki

Smith-Waterman局部比对

更新:2026-10-13;状态:可用;验证范围:合成数据实测。

Smith–Waterman 用动态规划找到给定打分规则下的最优局部比对,适合理解序列比对的精确基线。

状态与递推

H(i,j) 表示以两个序列的第 i、j 个字符结束的最佳局部得分。使用线性空位罚分 g > 0 时:

H(i,j) = max(0,
             H(i-1,j-1) + s(query[i-1], subject[j-1]),
             H(i-1,j) - g,
             H(i,j-1) - g)

0 允许从当前位置重新开始。记录最优得分的格子,沿来源回溯到 0,得到局部区间;这与必须覆盖整个序列的全局比对不同。若采用仿射空位罚分,需要增加相应状态,不能只把 g 改成一个常数就声称完成。

实现与检查

本项目教学代码使用人工字符串和匹配 +2、错配 −1、空位 −2,返回得分、对齐字符与区间;区间使用 0 基、右开形式。

python3 examples/alignment_demo.py

实测 ABCD 对 XXABCDYY 得分 8;完全不同字符得分 0;ABCDE 对 ABXCDE 得分 8,包含一个空位。代码是教学实现,采用完整矩阵,时间与空间量级均为 O(mn)。

为什么还需要BLAST

数据库有大量序列时,逐条完整动态规划成本很高。BLAST原理与种子延伸用启发式缩小搜索范围,但可能漏掉没有合适种子的局部匹配。

原始方法见 Smith & Waterman, 1981。