跳转到内容

图算法在生物信息学中的应用

快速概览

图算法为理解和解决生物信息学中的复杂问题提供了统一框架,从基因组组装到系统发育分析,图结构无处不在。

  • 将生物学问题转化为图问题是理解的关键第一步
  • 图的类型(有向/无向、加权/无权)决定适用的算法
所属板块 分析方向与案例

把基础对象与算法方法重新放回真实分析任务与工作流。

阅读目标 帮助建立阅读上下文

先判断这页与你当前问题的关系,再决定是否深入展开。

建议前置 先建立相关基础对象与方法直觉

建议先建立相关基础对象与方法直觉,再进入本页。

生物信息学中的许多问题天然具备图结构:

  • 序列关系:reads 之间的重叠可表示为图
  • 进化关系:物种间的进化关系形成树状结构
  • 调控网络:基因调控网络是复杂的图结构
  • 蛋白相互作用:蛋白质相互作用网络

图算法的价值在于:

  • 统一视角:不同问题可用相同的图算法框架理解
  • 成熟工具:图论拥有丰富的理论成果与算法库
  • 可视化:图结构便于直观理解与分析
  • 可扩展性:图算法通常具有良好的并行化潜力

邻接矩阵

A B C
A [ 0 1 0 ]
B [ 1 0 1 ]
C [ 0 1 0 ]

邻接表

A: [B]
B: [A, C]
C: [B]

选择准则

  • 稠密图:使用邻接矩阵
  • 稀疏图:使用邻接表(生物信息学中常见)
类型特征生物信息学应用
无向图边无方向蛋白质相互作用网络
有向图边有方向de Bruijn graph,调控网络
加权图边有权重序列比对得分图
无环连通图系统发育树
有向无环图(DAG)有向无环依赖关系图,贝叶斯网络
超图边连接多个顶点多序列比对关系

算法

DFS(v):
标记 v 为已访问
对于 v 的每个邻居 u:
如果 u 未访问:
DFS(u)

应用

  • 连通分量检测
  • 拓扑排序
  • 路径查找

复杂度:O(V + E)

算法

BFS(v):
队列 Q = [v]
标记 v 为已访问
当 Q 非空:
u = Q.dequeue()
对于 u 的每个邻居 w:
如果 w 未访问:
标记 w 为已访问
Q.enqueue(w)

应用

  • 最短路径(无权图)
  • 连通性分析
  • 层次结构构建

复杂度:O(V + E)

问题:求解单源最短路径(非负权重)

算法

Dijkstra(G, s):
初始化距离:d[s] = 0, d[v] = ∞ (v ≠ s)
优先队列 PQ = \{(0, s)\}
当 PQ 非空:
(d[u], u) = PQ.extract_min()
对于 u 的每个邻居 v:
如果 d[u] + w(u,v) < d[v]:
d[v] = d[u] + w(u,v)
PQ.insert((d[v], v))

复杂度:O((V + E) log V) 使用优先队列

应用

  • 序列比对中的最优路径搜索
  • 网络流分析
  • 距离计算

Floyd-Warshall 算法(全源最短路径)

Section titled “Floyd-Warshall 算法(全源最短路径)”

问题:计算所有顶点对之间的最短路径

递推公式

d{ij}{(k)}=min(d{ij}{(k1)},d{ik}{(k1)}+d{kj}{(k1)})d_\{ij\}^\{(k)\} = \min(d_\{ij\}^\{(k-1)\}, d_\{ik\}^\{(k-1)\} + d_\{kj\}^\{(k-1)\})

复杂度:O(V³)

应用

  • 系统发育距离矩阵
  • 网络分析

3. 最小生成树(Minimum Spanning Tree, MST)

Section titled “3. 最小生成树(Minimum Spanning Tree, MST)”

问题:寻找连接所有顶点的最小权重边集合

算法

Prim(G):
选择任意顶点 s
MST = \{s\}
当 MST 顶点数 < V:
找到连接 MST 和外部顶点的最小权重边(u, v)
将 v 加入 MST

复杂度:O(E log V)

应用

  • 进化树构建(类似 UPGMA 思想)
  • 网络设计
  • 聚类分析

算法

Kruskal(G):
按权重排序所有边
MST = ∅
对于每条边(u, v)(按权重递增):
如果 u 和 v 不连通:
将(u, v) 加入 MST
合并 u 和 v 的连通分量

复杂度:O(E log E)

问题:对 DAG 的顶点进行线性排序,使得对于每条有向边(u, v),u 均位于 v 之前。

算法(Kahn 算法):

TopologicalSort(G):
计算所有顶点的入度
将入度为 0 的顶点加入队列
当队列非空:
u = queue.dequeue()
输出 u
对于 u 的每个邻居 v:
入度[v]--
如果入度[v] == 0:
queue.enqueue(v)

复杂度:O(V + E)

应用

  • 任务调度
  • 依赖关系分析
  • 基因调控网络分析

5. 强连通分量(Strongly Connected Components, SCC)

Section titled “5. 强连通分量(Strongly Connected Components, SCC)”

问题:寻找有向图中互相可达的顶点集合。

Kosaraju 算法

Kosaraju(G):
1. 对 G 进行 DFS,记录完成时间
2. 反转图 G 得到 G^T
3. 按完成时间递减顺序对 G^T 进行 DFS
4. 每次 DFS 的顶点集合为一个 SCC

复杂度:O(V + E)

应用

  • 网络模块检测
  • 周期性分析

构造方法

  • 顶点:(k-1)-mer
  • 边:k-mer(连接前缀与后缀)

Worked Example

序列:AAGATTCTCTA,k = 4

k-mer 列表:

  • AAGA → AAG → AGA
  • AGAT → AGA → GAT
  • GATT → GAT → ATT
  • ATTC → ATT → TTC
  • TTCT → TTC → TCT
  • TCTC → TCT → CTC
  • CTCT → CTC → TCT
  • TCTA → TCT → CTA

图结构:

AAG → AGA → GAT → ATT → TTC → TCT → CTC
└──── TCTA

算法问题

  • 欧拉路径:遍历所有边恰好一次
  • 图简化:去除 tips、bubbles
  • 重复解析:处理复杂分叉

构造

  • 顶点:reads
  • 边:reads 之间的重叠关系

应用

  • 长读长组装(PacBio、Nanopore)
  • OLC(Overlap-Layout-Consensus)算法

问题:基于距离矩阵构建系统发育树。

算法

UPGMA(D):
初始化:每个序列为一个簇
当簇数 > 1:
找到距离最小的两个簇 C_i, C_j
合并 C_i 和 C_j 为新簇 C_new
更新距离矩阵
记录合并操作(构建树)

Worked Example

距离矩阵:

A B C D
A [ 0 5 9 9 ]
B [ 5 0 10 10 ]
C [ 9 10 0 8 ]
D [ 9 10 8 0 ]

步骤 1:合并 A 和 B(距离 5)

  • 新簇 AB 的高度 = 5/2 = 2.5
  • 更新距离:
    • d(AB, C) = (5+9)/2 = 7
    • d(AB, D) = (5+9)/2 = 7

步骤 2:合并 C 和 D(距离 8)

  • 新簇 CD 的高度 = 8/2 = 4
  • 更新距离:
    • d(AB, CD) = (7+7)/2 = 7

步骤 3:合并 AB 和 CD(距离 7)

  • 新簇 ABCD 的高度 = 7/2 = 3.5

最终树:

┌── A
┌───┤
│ └── B
────┤
│ ┌── C
└───┤
└── D

特点

  • 不假设分子钟恒定
  • 适用于进化速率不均匀的场景

核心思想

  • 最小化总树长
  • 选择能够减少总树长的邻居对

指标

  • 度(Degree):顶点的连接数
  • 度分布:网络中度的分布情况
  • 聚类系数(Clustering Coefficient):邻居之间的连接密度
  • 路径长度(Path Length):顶点间的平均距离
  • 中心性(Centrality):顶点的重要性度量

应用

  • 识别关键调控因子
  • 模块检测
  • 网络比较

方法

  • 模块度优化(Modularity Optimization):最大化社区内部连接
  • 标签传播(Label Propagation):基于邻居标签更新
  • 谱聚类(Spectral Clustering):基于拉普拉斯矩阵的特征向量分解

应用

  • 功能预测:基于邻居功能推断
  • 复合物检测:识别密集连接的子图
  • 疾病基因识别:筛选中心性高的节点

算法

  • 最大团检测(Maximal Clique Detection)
  • 密集子图挖掘
  • 中心性计算(PageRank, Betweenness)

思想:根据启发式规则提前剪除不可能的分支。

应用

  • 组装图简化
  • 系统发育树搜索空间缩减

思想:在多项式时间内寻找近似最优解。

示例

  • 最小生成树近似
  • 聚类近似

策略

  • 图遍历并行化
  • 最短路径并行计算
  • 分布式图处理(如 Pregel、GraphX)

方法

  • 稀疏矩阵存储
  • 图压缩(如 WebGraph)
  • 增量式更新
算法时间复杂度空间复杂度适用场景
DFS/BFSO(V + E)O(V)连通性、遍历
DijkstraO((V + E) log V)O(V)单源最短路径
Floyd-WarshallO(V³)O(V²)全源最短路径
Prim/KruskalO(E log V)O(V + E)最小生成树
拓扑排序O(V + E)O(V)DAG 排序
  • SPAdes:基于 de Bruijn graph,使用多 k-mer 策略
  • Canu:基于 overlap graph,用于长读长
  • Flye:基于 repeat graph,处理复杂重复
  • MEGA:实现 UPGMA、NJ 等方法
  • RAxML:最大似然树构建,使用启发式搜索
  • MrBayes:贝叶斯系统发育,MCMC 采样
  • Cytoscape:网络可视化和分析
  • igraph:图算法库
  • NetworkX:Python 图分析库
  1. 明确问题类型:路径问题、连通性问题还是优化问题?
  2. 分析图的性质:有向/无向、加权/无权、稀疏/稠密?
  3. 评估规模:顶点数和边数的量级?
  4. 确定需求:精确解还是近似解?实时性要求?
  1. 选择合适的数据结构:邻接表 vs 邻接矩阵
  2. 利用稀疏性:生物信息学中的图通常较稀疏
  3. 预处理:必要时进行图简化
  4. 可视化:小规模图的可视化有助于调试
  1. 小规模测试:手工验证小例子
  2. 中间输出:打印中间状态
  3. 边界条件:测试空图、单点图等边界情况
  4. 已知答案:用已知结果的案例验证
  1. 构造序列 ABCABD 的 de Bruijn graph(k = 3)
  2. 手动运行 Dijkstra 算法找到最短路径
  3. 实现一个简单的 DFS 来检测连通分量
  4. 比较 Prim 和 Kruskal 算法在不同图上的性能
  • Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to algorithms (4th ed.). MIT press.
  • Pevzner, P. A. (2000). Computational molecular biology: an algorithmic approach. MIT press.
  • Jones, N. C., & Pevzner, P. A. (2004). An introduction to bioinformatics algorithms. MIT press.
  • 视觉化构建逻辑
  1. 节点拆分:将每个长度为 kk 的序列(k-mer) 视为连接两个 (k1)(k-1)-mer 的”边”。
  2. 图合并:由于节点是长度为 k1k-1 的重叠前缀/后缀,相同的子串会自动塌陷为同一个节点。
  3. 气泡(Bubble) 产生:当由于测序错误或 SNP 导致序列在中间位置出现微小差异时,图上会形成”闭合回路”,即气泡。
  4. 死胡同(Tip):测序末端的错误通常表现为从主路径分叉出的短枝条。

组装流程的视觉隐喻

  • de Bruijn Graph:像拼图游戏,通过局部的边缘匹配(重叠 k1k-1)还原全局图案。
  • OLC (Overlap-Layout-Consensus):像通过长线段的重叠部分,将它们排列组合成最长的连续支架(Scaffold)。

详见:de Bruijn graph 组装