跳转至

25. 序列比对原理与算法

一句话说明

序列比对(Sequence Alignment)是通过算法找出两条或多条生物序列(DNA/RNA/蛋白质)之间的相似区域,从而推断功能、结构或进化关系的核心生信技术。


1. 序列比对是什么

白话解释: 序列比对就像"两段文字找相似"。假设你有两句话:

句子A:我今天去超市买了苹果和香蕉
句子B:我昨天去商店买了苹果和橘子

比对就是把这两句话一个字一个字对齐,找出哪些位置相同("我"、"去"、"买了苹果和"),哪些位置不同("今天/昨天"、"超市/商店"、"香蕉/橘子")。

在生物信息学里,"句子"变成了 DNA 序列(ATCG)或蛋白质序列(20种氨基酸字母),"找相似"的目的是: - 功能推断:如果两段序列很像,可能功能也类似 - 进化分析:相似度高说明两个物种亲缘关系近 - 变异检测:reads 比对到参考基因组后,不同的位置就是突变位点

关键概念区分: - 序列相似性(Similarity):两条序列有多"像",可用百分比衡量 - 序列同源性(Homology):两条序列是否有共同祖先(是/否,不能说"80%同源") - 序列一致性(Identity):完全相同的位置比例


2. 全局比对 vs 局部比对

2.1 全局比对:Needleman-Wunsch 算法(1970年)

白话解释: 把两条序列从头到尾强制对齐,就像两个人并排站着从头比到脚。

适用场景: 两条序列长度差不多、整体都相关(如同一个基因的不同物种版本)。

动态规划原理(白话:填表格找最优路径)

动态规划的核心思想:一个大问题拆成很多小问题,每个小问题的最优解叠加起来就是大问题的最优解。

具体步骤:

序列1: A G C T
序列2: A C T

第一步:画一个 (m+1) × (n+1) 的表格(m和n是两条序列的长度)

        -    A    G    C    T
   -  [ 0] [-1] [-2] [-3] [-4]    ← 第一行/列用gap罚分填满
   A  [-1] [ 1] [ 0] [-1] [-2]
   C  [-2] [ 0] [ 0] [ 1] [ 0]
   T  [-3] [-1] [-1] [ 0] [ 2]  ← 右下角就是最终得分

第二步:每个格子从三个方向选最大值:
   ↖ 对角线(匹配/错配):上一格分数 + 匹配分or错配罚分
   ← 左边(序列2插入gap):左格分数 + gap罚分
   ↑ 上边(序列1插入gap):上格分数 + gap罚分

第三步:从右下角回溯到左上角,走过的路径就是最优比对结果

时间复杂度:O(mn),空间复杂度 O(mn)。两条 1000bp 的序列 → 填 100万格。

2.2 局部比对:Smith-Waterman 算法(1981年)

白话解释: 只找两条序列里"最像的那一小段",不要求从头对到尾。就像在两本书里找一段相同的引用。

与 Needleman-Wunsch 的关键区别:

特征Needleman-Wunsch(全局)Smith-Waterman(局部)
目标整条序列对齐找最相似的子片段
负分处理允许负分负分置零(核心区别)
回溯起点右下角全表最高分的格子
回溯终点左上角遇到0停止
适用场景同源基因比较在长序列中找功能域
时间复杂度O(mn)O(mn)

适用场景: 一条很长的基因组序列中找一个短的功能域,或两条序列只有局部相似。

2.3 打分矩阵(Scoring Matrix)

打分矩阵决定了"两个字母对上了该加几分、对错了该扣几分"。

DNA打分:简单替换

匹配(match):+1 或 +5
错配(mismatch):-1 或 -4

蛋白质打分:BLOSUM 和 PAM

矩阵全称构建方法适用场景
BLOSUM62BLOcks SUbstitution Matrix从已知蛋白质家族的保守区域统计氨基酸替换频率,62表示聚类时序列一致性≥62%的归为一组一般搜索,BLAST默认
BLOSUM80同上,80%一致性聚类更严格近缘序列比较
BLOSUM45同上,45%一致性聚类更宽松远缘序列比较
PAM1Point Accepted Mutation从亲缘极近的序列推算1%突变率的替换概率
PAM250PAM1矩阵自乘250次模拟250个进化单位远缘序列比较

白话记忆: - BLOSUM数字越→对越的序列敏感(BLOSUM80看近亲) - PAM数字越→对越的序列敏感(PAM250看远亲) - 方向相反!面试常考混淆点

2.4 Gap 罚分(Gap Penalty)

Gap = 比对中引入的"空位",代表插入/缺失突变(indel)。

线性罚分(Linear Gap Penalty)

罚分 = d × L
d = 每个gap的罚分(如 -2)
L = gap长度

例:gap长度5 → 罚分 = -2 × 5 = -10

仿射罚分(Affine Gap Penalty)— 更符合生物学现实

罚分 = 开gap罚分(Gap Open) + 延伸罚分(Gap Extension) × (L-1)

例:Gap Open = -10, Gap Extension = -1, gap长度5
罚分 = -10 + (-1) × 4 = -14

而线性模型:-2 × 5 = -10(惩罚不够)

为什么用仿射? 生物学上,产生一个 indel 事件比延伸一个已有的 indel 更"困难"。一次突变可能删掉一整段,而不是每删一个碱基都是独立事件。所以"开口"要罚重,"延续"罚轻。


3. 启发式比对:BLAST 原理

3.1 为什么需要 BLAST

Smith-Waterman 保证找到最优解,但 O(mn) 太慢: - 一条 1000bp 的序列搜索一个 30亿bp 的基因组 → 3×10^12 次计算 - 搜索 GenBank 数据库(万亿级碱基)根本不可行

BLAST(Basic Local Alignment Search Tool, 1990年)用启发式(heuristic)方法,牺牲一点准确性换取50倍以上的加速。

3.2 种子-延伸策略(Seed-and-Extend)

白话解释: 不要逐字逐句比,先找"关键词",有共同关键词的地方再仔细看。

步骤:
1. 切词(Word/Seed):把查询序列切成短片段
   - 蛋白质:默认3个氨基酸一个词(word size=3)
   - DNA:默认11个碱基一个词(word size=11)

2. 查表:把这些短词和数据库中所有序列快速比对
   - 只保留得分超过阈值 T 的匹配("命中"/hit)

3. 延伸(Extension):从每个命中位置向两边延伸
   - 延伸时计分,分数下降超过阈值就停止
   - 得到 HSP(High-scoring Segment Pair,高分片段对)

4. 评估:用统计学方法评估 HSP 的显著性(E-value)

3.3 E-value 是什么

E-value(Expect value,期望值): 在相同大小的随机数据库中,偶然出现得分≥当前得分的比对数目的期望。

白话解释: "如果数据库全是随机序列,能碰巧出现这么好的比对结果的次数"。

E-value含义判断
1e-5010^-50次偶然出现极其显著,肯定同源
1e-10非常不可能偶然很显著
0.01100次随机搜索出现1次可能有意义,需验证
1随机就能出现1次不显著
10随机能出现10次无意义

关键公式理解(不需要记公式,理解因素): - E-value 与数据库大小成正比(库越大,偶然匹配越多) - E-value 与比对得分成反比(得分越高,越不可能偶然) - E-value ≠ p-value,但 E << 1 时两者近似

3.4 BLAST 家族程序

程序查询→数据库用途
blastn核酸→核酸DNA序列搜索
blastp蛋白→蛋白蛋白质序列搜索
blastx核酸(翻译)→蛋白未知DNA翻译后搜索蛋白库
tblastn蛋白→核酸(翻译)用蛋白质搜索核酸库
tblastx核酸(翻译)→核酸(翻译)六框翻译互搜,最慢
megablast核酸→核酸高度相似序列快速搜索(word size=28)
PSI-BLAST蛋白→蛋白(迭代)发现远缘同源,构建PSSM迭代搜索

白话记忆: - 名字里有 "n" = nucleotide(核酸) - 名字里有 "p" = protein(蛋白) - 名字里有 "t" = translated(翻译) - 名字里有 "x" = 查询序列被翻译


4. 短读比对算法:BWT + FM-index

4.1 为什么 BLAST 不适合短读比对

问题BLAST短读比对需求
查询数量几条到几百条几千万到几亿条reads
速度要求分钟级可接受必须秒级处理每条read
查询长度几百到几千bp75-300bp
索引方式每次搜索扫描数据库需要一次建索引反复用
Gap处理支持大gap短reads很少有大gap

总结:BLAST 是为"少量查询搜大库"设计的,短读比对是"海量短查询比对一个固定参考"的场景。

4.2 BWT(Burrows-Wheeler Transform)原理

白话解释: BWT 是一种文本变换,能把参考基因组"压缩+重排"成一种特殊格式,让搜索变得极快。

原理演示(以字符串 "banana$" 为例):

第一步:生成所有旋转(cyclic rotations)
banana$    ← 原始
anana$b    ← 向左旋转1位
nana$ba    ← 向左旋转2位
ana$ban    ← 向左旋转3位
na$bana    ← 向左旋转4位
a$banan    ← 向左旋转5位
$banana    ← 向左旋转6位

第二步:按字典序排序
$banana
a$banan
ana$ban
anana$b
banana$
na$bana
nana$ba

第三步:取最后一列 → BWT结果
annb$aa    ← 这就是BWT变换后的字符串

特性:相同字符聚集在一起,极易压缩!

4.3 FM-index(Full-text Minute-space index)

白话解释: FM-index 是在 BWT 基础上建的索引结构,通过两个表(C表和Occ表)实现O(1)的字符定位。

搜索模式串的核心操作(Backward Search):
- 从模式串的最后一个字符开始
- 每次用 LF-mapping(Last-to-First映射)缩小候选范围
- 最终得到模式串在原文中所有出现位置

时间复杂度:O(m),m是模式串长度
与参考基因组大小无关!

为什么快: - 建索引一次(人类基因组索引约4-8GB),之后每条 read 搜索时间只和 read 长度相关 - 不需要遍历整个基因组 - BWA 和 Bowtie2 都基于此原理

4.4 BWA 与 Bowtie2 的算法差异

特性BWA-MEMBowtie2
索引BWT + FM-indexBWT + FM-index(mirror index)
种子策略SMEM(超级最大精确匹配)从read提取子串做FM搜索
延伸Smith-Waterman对种子做局部延伸动态规划延伸
特色对100bp以上reads更优支持local模式,内存占用更小

5. 长读比对算法:minimap2 的 Minimizer 策略

5.1 为什么需要新算法

三代测序(PacBio/Nanopore)的reads特点: - 长度:几千到几十万bp(vs 二代的100-300bp) - 错误率:Nanopore 5-15%,PacBio CLR ~10%,PacBio HiFi <1% - 错误类型:以插入/缺失为主(vs 二代以替换为主)

BWT 对 exact match 非常高效,但高错误率下精确匹配的种子太短、太碎,效率反而下降。

5.2 Minimizer 是什么

白话解释: 在一个滑动窗口里挑"最小的那个词"作为代表。就像每一段话挑一个"关键词"做书签。

概念:
- k-mer:长度为k的连续子串(如k=5:ATCGA)
- w-minimizer:在连续w个k-mer中,hash值最小的那个k-mer

示例(k=3, w=3):
序列:A T C G A C T
k-mers: ATC, TCG, CGA, GAC, ACT
窗口1 (ATC, TCG, CGA) → 选hash最小的
窗口2 (TCG, CGA, GAC) → 选hash最小的
窗口3 (CGA, GAC, ACT) → 选hash最小的

效果:只需存储和比较 ~2/(w+1) 的k-mer
      大大减少了需要处理的种子数量

5.3 minimap2 的三步流程

1. 收集种子(Seeding)
   - 对参考和query都提取minimizer
   - 通过hash表找到共同的minimizer(锚点/anchor)

2. 链式连接(Chaining)
   - 把距离合理的锚点串成链(chain)
   - 用动态规划找最优链(考虑锚点间距和方向一致性)
   - 时间复杂度:O(n log n),n是锚点数

3. 局部比对(Alignment)
   - 只对链覆盖的区域做精确比对(带gap的SW)
   - 大大减少了需要精确比对的区域

minimap2 的优势: - 速度:比 BWA-MEM 快 3-50 倍(取决于数据类型) - 通用:支持短读、长读、RNA-seq、基因组间比对 - 内存:人类基因组索引仅需 ~6.5 GB


6. 多序列比对(MSA)

6.1 什么是多序列比对

同时对齐 3 条以上序列,找出所有序列的共同保守区域。

用途: - 构建系统发育树 - 发现保守功能域 - 设计引物/探针 - 预测蛋白质结构

6.2 为什么不能用两两比对直接推

  • 最优的两两比对组合不等于最优的多序列比对
  • 精确多序列比对是 NP-hard 问题(序列越多计算量指数增长)
  • 所以都用启发式方法

6.3 主流 MSA 算法

工具策略特点
ClustalW/Omega渐进比对(Progressive)先建guide tree,按树的顺序逐步加入序列比对。经典但对早期错误敏感
MUSCLE迭代精炼(Iterative Refinement)先快速渐进比对,再反复迭代改进。速度快精度高
MAFFTFFT加速 + 多种策略用快速傅里叶变换加速配对距离计算,支持多种算法模式(最快L-INS-i到最准E-INS-i)
T-Coffee一致性打分综合多种比对信息提高准确度,但较慢

白话理解渐进比对:

假设有4条序列A,B,C,D
1. 两两比对得到距离矩阵
2. 根据距离建引导树:((A,B),(C,D))
3. 先比对A和B → 得到 AB
4. 再比对C和D → 得到 CD  
5. 最后比对 AB 和 CD → 得到 ABCD
问题:步骤3如果错了,后面全跟着错(error propagation)


7. Python 实操:用 Biopython 做序列比对

# ============ Python 序列比对实操 ============
# 环境:conda activate bioinfo
# 安装:pip install biopython

# --- 示例1:手动实现简化版 Needleman-Wunsch ---
import numpy as np  # 数值计算库

def needleman_wunsch(seq1, seq2, match=1, mismatch=-1, gap=-2):
    """
    简化版全局比对(Needleman-Wunsch算法)
    seq1, seq2: 输入的两条序列(字符串)
    match: 匹配得分
    mismatch: 错配罚分
    gap: 空位罚分
    返回:最优得分和比对结果
    """
    m, n = len(seq1), len(seq2)  # 获取两条序列的长度

    # 第一步:初始化得分矩阵(m+1行 × n+1列,多一行一列给gap)
    score_matrix = np.zeros((m + 1, n + 1), dtype=int)

    # 第一行和第一列用gap罚分递增填充
    for i in range(1, m + 1):
        score_matrix[i][0] = score_matrix[i-1][0] + gap  # 第一列
    for j in range(1, n + 1):
        score_matrix[0][j] = score_matrix[0][j-1] + gap  # 第一行

    # 第二步:填表(动态规划核心)
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            # 判断当前位置是匹配还是错配
            if seq1[i-1] == seq2[j-1]:
                diag_score = score_matrix[i-1][j-1] + match    # 对角线:匹配
            else:
                diag_score = score_matrix[i-1][j-1] + mismatch # 对角线:错配

            up_score = score_matrix[i-1][j] + gap     # 从上方来:seq2加gap
            left_score = score_matrix[i][j-1] + gap   # 从左方来:seq1加gap

            # 取三个方向的最大值
            score_matrix[i][j] = max(diag_score, up_score, left_score)

    # 第三步:回溯(从右下角走到左上角)
    align1, align2 = "", ""  # 存储比对结果
    i, j = m, n  # 从右下角开始

    while i > 0 or j > 0:
        current = score_matrix[i][j]

        if i > 0 and j > 0:
            if seq1[i-1] == seq2[j-1]:
                s = match
            else:
                s = mismatch

        if i > 0 and j > 0 and current == score_matrix[i-1][j-1] + s:
            align1 = seq1[i-1] + align1  # 对角线走:两序列都出一个字符
            align2 = seq2[j-1] + align2
            i -= 1
            j -= 1
        elif i > 0 and current == score_matrix[i-1][j] + gap:
            align1 = seq1[i-1] + align1  # 向上走:seq2加gap
            align2 = "-" + align2
            i -= 1
        else:
            align1 = "-" + align1        # 向左走:seq1加gap
            align2 = seq2[j-1] + align2
            j -= 1

    return score_matrix[m][n], align1, align2

# 测试
seq1 = "AGCTGA"
seq2 = "ACGA"
score, a1, a2 = needleman_wunsch(seq1, seq2)
print(f"得分: {score}")    # 输出最优比对得分
print(f"序列1: {a1}")      # 输出比对后的序列1
print(f"序列2: {a2}")      # 输出比对后的序列2
# 预期输出:
# 得分: 0
# 序列1: AGCTGA
# 序列2: A-CG-A


# --- 示例2:用 Biopython 调用 pairwise2 模块做比对 ---
from Bio import pairwise2                        # Biopython的两序列比对模块
from Bio.pairwise2 import format_alignment       # 格式化输出比对结果

seq1 = "AGCTGATCG"
seq2 = "ACGATCG"

# globalxx:全局比对,只计匹配(+1)和错配(0),不罚gap
alignments = pairwise2.align.globalms(
    seq1, seq2,
    2,    # match得分(匹配+2)
    -1,   # mismatch罚分(错配-1)
    -3,   # gap open罚分(开gap-3)
    -1    # gap extend罚分(延伸gap-1)
)

# 打印最优比对(可能有多个并列最优)
print("=== Biopython 全局比对结果 ===")
for align in alignments[:3]:  # 只看前3个结果
    print(format_alignment(*align))  # 格式化打印


# --- 示例3:用 Biopython 做 BLAST 搜索(在线) ---
from Bio.Blast import NCBIWWW, NCBIXML  # NCBI BLAST接口

# 一条示例16S rRNA序列片段
query_seq = "AGAGTTTGATCCTGGCTCAGGATGAACGCTGGCGGCGTGCCTAATACATGCAAGTCGAGCGG"

# 提交到NCBI BLAST服务器(blastn搜索核酸库)
# 注意:这是在线搜索,需要网络,可能需要几分钟
print("正在提交BLAST搜索...")
result_handle = NCBIWWW.qblast(
    "blastn",       # 程序名:核酸搜核酸
    "nt",           # 数据库:nt(核酸总库)
    query_seq,      # 查询序列
    expect=0.01     # E-value阈值
)

# 解析结果
blast_record = NCBIXML.read(result_handle)  # 解析XML格式结果

print(f"\n找到 {len(blast_record.alignments)} 条比对结果")
# 打印前3条结果
for i, alignment in enumerate(blast_record.alignments[:3]):
    hsp = alignment.hsps[0]  # 取第一个HSP
    print(f"\n--- 结果 {i+1} ---")
    print(f"目标: {alignment.title[:80]}...")  # 目标序列名称
    print(f"得分: {hsp.score}")                # 比对得分
    print(f"E-value: {hsp.expect}")            # E值
    print(f"一致性: {hsp.identities}/{hsp.align_length} "
          f"({hsp.identities/hsp.align_length*100:.1f}%)")  # 一致性百分比

8. 面试怎么答

Q1:请解释全局比对和局部比对的区别,分别在什么场景使用?

全局比对(Needleman-Wunsch)是把两条序列从头到尾强制对齐,适合比较两个同源基因的完整序列,比如不同物种的同一个基因。局部比对(Smith-Waterman)只找两条序列中最相似的片段,适合在一条长序列中搜索是否包含某个功能域,或者两条序列只有部分区域相关的情况。核心算法区别是:局部比对的动态规划矩阵中负分归零,回溯从全局最高分开始到遇零停止。两者时间复杂度都是 O(mn)。

Q2:BLAST 的原理是什么?为什么比 Smith-Waterman 快?

BLAST 是一个启发式算法,核心是"种子-延伸"策略。首先把查询序列切成短词(DNA默认11mer,蛋白质默认3mer),在数据库中快速查找这些短词的精确匹配或近似匹配(种子阶段),然后从命中位置向两侧延伸形成 HSP。它比 Smith-Waterman 快的原因是:SW需要填满整个 O(mn) 的矩阵,而 BLAST 只在有种子命中的区域做延伸计算,大部分区域直接跳过了。代价是可能遗漏一些没有种子匹配的弱相似区域。

Q3:E-value 是什么?如何判断一个 BLAST 结果是否显著?

E-value 是期望值,表示在同等大小的随机数据库中偶然出现得分≥当前比对的次数期望。E-value 越小越显著:1e-50 几乎确定是同源;1e-5 到 1e-10 比较可靠;大于 0.01 就要谨慎了。需要注意 E-value 和数据库大小有关——同一条比对在更大的库中搜索 E-value 会更大(偶然匹配更多),所以不能跨数据库比较 E-value。

Q4:BWA/Bowtie2 为什么用 BWT 而不用 BLAST 来比对短reads?

场景根本不同。BLAST 设计目标是"几条序列搜大库",适合探索性搜索。NGS 比对是"几亿条短reads对一个固定参考基因组"。BWT+FM-index 的优势是:建一次索引后,每条 read 的搜索时间只和 read 长度相关(O(m)),与参考基因组大小无关。处理3000万条reads时,BWT方法只需几十分钟,而BLAST可能需要几天。另外BWT索引占用内存小(人类基因组约4-8GB),支持多线程并行。

Q5:minimap2 和 BWA-MEM 有什么区别?什么时候用哪个?

minimap2 使用 minimizer 做种子而非 BWT。minimizer 是滑动窗口内 hash 值最小的 k-mer,只需存储约 1/(w+1) 的 k-mer 就能覆盖全序列。minimap2 的优势是能容忍高错误率(三代测序),速度更快。BWA-MEM 精度更高,是二代测序标准流程(GATK 推荐)。选择规则:短读(Illumina)→ BWA-MEM/Bowtie2;长读(PacBio/Nanopore)→ minimap2;如果是 HiFi reads 两者都可以。

Q6:什么是仿射 gap 罚分?为什么比线性罚分更好?

仿射罚分区分"开gap"和"延伸gap"两个参数,开口罚分重(如-10),延伸罚分轻(如-1)。生物学依据是:一次 indel 事件通常影响连续多个碱基,所以一个长 gap 更可能是一次事件而非多次独立事件。如果用线性罚分(每个位置扣相同分),会倾向于产生很多分散的短 gap,不符合生物现实。

Q7:BLOSUM62 中的 62 代表什么?和 PAM250 有什么区别?

BLOSUM62 表示构建矩阵时,将一致性≥62% 的序列聚为一类来统计氨基酸替换频率。BLOSUM 数字越大对近缘序列越敏感,越小对远缘序列越敏感。PAM250 是 PAM1(1%突变率下的替换概率)自乘250次模拟的远距离进化矩阵。两者构建思路相反但都用于打分:BLOSUM 从"保守区块"直接统计;PAM 从"极近缘序列"外推。实际使用中 BLOSUM62 是 BLAST 默认,效果通常更好。


9. 速查表

算法→适用场景→时间复杂度 对照表

算法/方法类型适用场景时间复杂度空间复杂度是否保证最优
Needleman-Wunsch全局比对同源基因端到端比较O(mn)O(mn)
Smith-Waterman局部比对搜索功能域/motifO(mn)O(mn)是(局部最优)
BLAST启发式局部数据库搜索~O(m) 平均
BWT + FM-index短读精确匹配NGS reads比对参考O(m) 查询O(n) 索引精确匹配是
BWA-MEM短读/中读Illumina 比对O(m) + SW延伸~4-8 GB启发式
Bowtie2短读去宿主/ChIP-seqO(m) + DP延伸~3.2 GB启发式
minimap2长读/通用PacBio/NanoporeO(n log n) 链~6.5 GB启发式
ClustalW/Omega多序列渐进建树/保守分析O(N²·L²)
MUSCLE多序列迭代精确MSAO(N²·L)
MAFFT多序列FFT大规模MSAO(N²·L) ~ O(N·L·log L)

注:m=查询长度, n=参考/数据库长度, N=序列条数, L=序列平均长度

常用打分方案速查

场景推荐打分矩阵/方案
DNA一般比对match=+1, mismatch=-1, gap=-2
BLAST DNA默认match=+2, mismatch=-3, gap open=-5, gap ext=-2
蛋白质一般搜索BLOSUM62 + gap open=-11, gap ext=-1
近缘蛋白比较BLOSUM80
远缘蛋白搜索BLOSUM45 或 PAM250

工具选择决策树

测序数据是什么类型?
├── Illumina 短读(100-300bp)
│   ├── 比对到参考基因组 → BWA-MEM2 / Bowtie2
│   ├── RNA-seq → HISAT2 / STAR(剪接比对)
│   └── 去宿主 → Bowtie2(--un-conc 参数方便)
├── PacBio / Nanopore 长读(>1kb)
│   └── minimap2(-ax map-pb / map-ont)
├── 蛋白质/基因搜索数据库
│   └── BLAST(blastp/blastn/blastx)
└── 多条序列对齐
    ├── <200条 → MUSCLE / MAFFT
    └── >200条 → MAFFT(速度优势)

10. 延伸资源

经典论文

  1. Needleman, S.B. & Wunsch, C.D. (1970). A general method applicable to the search for similarities in the amino acid sequence of two proteins. J Mol Biol, 48:443-453.
  2. Smith, T.F. & Waterman, M.S. (1981). Identification of common molecular subsequences. J Mol Biol, 147:195-197.
  3. Altschul, S.F. et al. (1990). Basic local alignment search tool. J Mol Biol, 215:403-410.
  4. Li, H. & Durbin, R. (2009). Fast and accurate short read alignment with Burrows-Wheeler transform. Bioinformatics, 25:1754-1760.
  5. Li, H. (2018). Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics, 34:3094-3100.
  6. Ferragina, P. & Manzini, G. (2000). Opportunistic data structures with applications. FOCS 2000. (FM-index原始论文)

在线学习

  • NCBI BLAST教程:https://blast.ncbi.nlm.nih.gov/doc/blast-help/
  • Rosalind 生信编程练习:http://rosalind.info/problems/locations/(有全局/局部比对编程题)
  • Ben Langmead BWT讲解视频(Johns Hopkins大学):搜索 "Ben Langmead BWT YouTube"

与本知识库其他文档的关系

  • 14_比对与组装工具.md:讲工具的具体使用命令和参数(HOW),本文讲底层算法原理(WHY)
  • 13_测序技术原理.md:理解不同测序平台产出的 reads 特征,有助于选择合适的比对算法
  • 01_宏基因组全流程.md:比对是全流程中"去宿主"和"定量"步骤的核心技术

总结记忆口诀

全局NW头对尾,局部SW找片段
BLAST种子加延伸,E值越小越靠谱
BWT压缩建索引,短读比对秒级处
minimizer挑代表,长读比对用minimap
MSA多条一起排,MAFFT快准第一选
BLOSUM大数看近亲,PAM大数看远亲