3. データ構造とアルゴリズム
3.0 アルゴリズム設計の理論的基盤
計算複雑性クラス:
- P: 多項式時間で解ける問題(配列アライメント)
- NP: 非決定性多項式時間(多重配列アライメント)
- #P: 解の個数を数える問題(RNA構造数え上げ)
- PSPACE: 多項式空間(RNA相互作用予測)
近似アルゴリズム理論:
近似比の定義: ρ = max(OPT/ALG, ALG/OPT)
- PTAS (Polynomial-Time Approximation Scheme): 任意のε > 0に対して(1+ε)近似
- FPTAS: さらに計算時間がεに関して多項式
- APX: 定数近似比を持つ問題クラス
確率的アルゴリズム:
- ラスベガス型: 常に正解、実行時間が確率的
- モンテカルロ型: 実行時間固定、解の品質が確率的
- Union-Find: ほぼ線形時間での集合操作
文字列アルゴリズムの数学的基礎:
- 有限オートマトン理論: パターンマッチングの状態機械
- Z-algorithm: 線形時間での周期性検出
- KMP法: 失敗関数による効率的検索
3.1 配列データ構造
Suffix Tree:
- 用途: 高速部分文字列検索
- 構築時間: O(n)
- 検索時間: O(m) (mは検索文字列長)
- メモリ使用量: O(n)
Burrows-Wheeler Transform (BWT):
- 用途: 配列圧縮・高速検索
- 圧縮率: 原文の1/4~1/8
- 検索時間: O(m + occ) (occは出現回数)
FM-Index:
原配列: ATGCATGC$
BWT変換: C$AATTGGC
FM-Index構築 → 高速後方検索が可能
FM-Indexの完全実装:
# BioPythonなどの依存関係については付録A参照
class FMIndex:
"""FM-Index実装(Burrows-Wheeler変換を使用した高速文字列検索)"""
def __init__(self, text):
"""
FM-Indexの構築
Args:
text: インデックス化する文字列
"""
self.text = text + '$' # 終端記号を追加
self.sa = self._build_suffix_array()
self.bwt = self._build_bwt()
self.occ = self._build_occ_table()
self.count = self._build_count_table()
def _build_suffix_array(self):
"""接尾辞配列の構築"""
n = len(self.text)
suffixes = [(self.text[i:], i) for i in range(n)]
suffixes.sort()
return [suffix[1] for suffix in suffixes]
def _build_bwt(self):
"""Burrows-Wheeler変換"""
bwt = []
for i in self.sa:
if i == 0:
bwt.append(self.text[-1])
else:
bwt.append(self.text[i-1])
return ''.join(bwt)
def _build_occ_table(self):
"""出現回数テーブルの構築"""
alphabet = set(self.bwt)
occ = {char: [0] for char in alphabet}
for i, char in enumerate(self.bwt):
for c in alphabet:
if c == char:
occ[c].append(occ[c][-1] + 1)
else:
occ[c].append(occ[c][-1])
return occ
def search(self, pattern):
"""
パターン検索
Args:
pattern: 検索パターン
Returns:
list: パターンの出現位置のリスト
"""
if not pattern:
return []
# 後方検索アルゴリズム
top = 0
bottom = len(self.bwt) - 1
for char in reversed(pattern):
if char not in self.occ:
return []
top = self._get_lf_mapping(char, top)
bottom = self._get_lf_mapping(char, bottom + 1) - 1
if top > bottom:
return []
# 出現位置を返す
positions = []
for i in range(top, bottom + 1):
positions.append(self.sa[i])
return sorted(positions)
実装上の価値: ナイーブな文字列検索はO(nm)の時間計算量を要するが、これらの高度なデータ構造により検索をO(m)に改善できる。ヒトゲノム(30億文字)規模では、検索時間を数時間から数秒に短縮可能である。圧縮効果により、メモリ使用量も大幅削減され、より大規模なデータの同時処理が可能となる。これにより、リアルタイム診断支援システムの実現が可能になる。
3.2 配列アライメントアルゴリズム
動的プログラミングの理論的基盤:
最適性原理 (Bellman): 最適解は最適部分解から構成される
重複部分問題: F(i,j)の値が複数回使用される
メモ化: 計算済み結果の保存による時間短縮
進化距離の数学的モデル:
- Jukes-Cantor モデル: 全置換が等確率(μt = -3/4 ln(1-4p/3))
- Kimura 2-parameter モデル: 転移・転換の区別
- HKY85 モデル: 塩基頻度の偏りを考慮
- GTR モデル: 6つの置換率パラメータ
統計的有意性評価:
E-value = Kmn exp(-λS)
- K: 検索空間の補正定数
- m,n: 配列長
- λ: Gumbel分布のパラメータ
- S: アライメントスコア
グローバルアライメント(Needleman-Wunsch法):
動的プログラミング:
F(i,j) = max{
F(i-1,j-1) + s(xi, yj), // マッチ/ミスマッチ
F(i-1,j) + gap, // 挿入
F(i,j-1) + gap // 削除
}
ローカルアライメント(Smith-Waterman法):
- グローバル法を局所最適化に拡張
- 0以下の値をリセット → 局所的類似領域を検出
高速近似法(BLAST):
- シード検索: 短い完全一致領域を特定
- 拡張: シード周辺の類似性評価
- 統計的有意性検定
スコア行列の理論的基礎:
PAM行列 (Point Accepted Mutation):
- 進化距離1 PAMは1%のアミノ酸変化
- PAM250: 平均2.5回の置換(遠縁関係)
BLOSUM行列 (BLOcks SUbstitution Matrix):
- 保存ブロック内の実際の置換頻度から導出
- BLOSUM62: 62%以上の同一性を持つ配列から構築
ギャップペナルティの最適化:
- 線形ギャップ: gap penalty = g × length
- アフィンギャップ: penalty = open + extend × (length-1)
- 凸ギャップ: 生物学的により現実的なモデル
応用における重要性: 配列アライメントは生物学的類似性の定量化手法である。進化関係の推定、機能推定、疾患原因変異の特定に不可欠である。厳密解法は計算量がO(nm)で大規模データに適用困難だが、BLASTによる近似解法により実用的な解析時間を実現している。これにより、未知配列の機能を既知データベースとの比較により数分で推定可能となる。
3.3 グラフアルゴリズム
グラフ理論の基礎概念:
グラフG = (V, E): 頂点集合Vと辺集合E
- 次数分布: P(k) = ネットワーク中の次数kのノード割合
- クラスタ係数: C = 3×三角形数 / 連結三組数
- 最短経路長: 全ノード対間の最短距離の平均
- 中心性: 重要ノードの定量的指標
生物学的ネットワークの位相的特性:
- スケールフリー性: P(k) ∝ k^(-γ), γ ≈ 2-3
- スモールワールド性: 高クラスタ係数 + 短い特性経路長
- 階層構造: モジュール内高密度、モジュール間低密度
- 堅牢性: ランダム攻撃に強く、標的攻撃に脆弱
ネットワーク中心性指標:
次数中心性: CD(v) = deg(v) / (n-1)
近接中心性: CC(v) = (n-1) / Σ d(v,u)
媒介中心性: CB(v) = Σ σst(v) / σst
固有ベクトル中心性: Av = λv (主固有ベクトル)
PageRank: PR(v) = (1-d)/n + d Σ PR(u)/deg(u)
コミュニティ検出アルゴリズム:
- Modularity最適化: Q = 1/2m Σ [Aij - kikj/2m]δ(ci,cj)
- Louvain法: 階層的クラスタリング
- Label Propagation: ラベル伝播による高速クラスタリング
- スペクトラル法: ラプラシアン行列の固有ベクトル
タンパク質相互作用ネットワーク:
- ノード: タンパク質
- エッジ: 相互作用関係
- 問題: 最短経路、クラスタリング、中心性解析
代謝パスウェイ解析:
- 有向グラフ: 代謝反応の流れ
- 重み: 反応速度定数
- 最適化: フラックスバランス解析(FBA)
フラックスバランス解析の数学的定式化:
線形計画問題:
max cᵀv
subject to: Sv = 0 (定常状態制約)
lb ≤ v ≤ ub (反応速度制約)
S: 化学量論行列
v: フラックスベクトル
c: 目的関数係数
ネットワーク解析の計算複雑性:
- 最短経路: Dijkstra O((V+E)logV), Floyd-Warshall O(V³)
-
最大フロー: Ford-Fulkerson O(E f* ), Dinic O(V²E) - 最小カット: Karger O(V²logV), Stoer-Wagner O(VE+V²logV)
- TSP (Traveling Salesman): NP困難、近似比3/2
システム医学への貢献: 生物学的システムはネットワーク構造を持つ。グラフ理論により、疾患は「ネットワークの摂動」として定量的に解析できる。薬剤標的の優先順位付け、副作用予測、多剤併用効果の予測が可能となる。例えば、中心性の高いノードを標的とすることで、より効果的な治療戦略を設計できる。システム全体の堅牢性解析により、耐性機構の理解も深まる。
3.4 シングルセルデータ構造
スパース行列表現:
# 細胞×遺伝子発現行列の効率的表現
import scipy.sparse as sp
class SingleCellDataStructure:
def __init__(self, expression_matrix):
# CSR形式でのスパース行列保存
self.data = sp.csr_matrix(expression_matrix)
self.n_cells, self.n_genes = self.data.shape
k-NN グラフ構造:
- 細胞間類似性の効率的計算
- Approximate Nearest Neighbor (ANN)アルゴリズム
- LSH (Locality Sensitive Hashing)による高速化
軌跡推定のための構造:
- 最小全域木(MST)
- 主曲線(Principal Curves)
- 拡散マップ(Diffusion Maps)
3.5 集団遺伝学のアルゴリズム
ハプロタイプフェージング:
- 隠れマルコフモデル(HMM)によるアプローチ
- Li-Stephensモデル
- SHAPEIT, Eagle等の実装
連鎖不平衡(LD)計算:
r² = (pAB - pA×pB)² / (pA×pa×pB×pb)
D' = D / Dmax
集団構造解析:
- 主成分分析(PCA)による祖先成分推定
- ADMIXTURE/STRUCTUREアルゴリズム
- f統計量(FST, f3, f4)
Previous | Table of Contents | Next |