好,这个我给你讲到真正听懂为止 👇FM-index 其实没那么神秘。
FM-index 是一种“压缩了的全文索引”,可以在不解压文本的情况下,快速查找任意子串。
它是:
所以叫 FM-index(Ferragina–Manzini)。
假设:
普通方法:
从头扫一遍书
太慢。
FM-index 方法:
先把书变形(BWT) 建立一个压缩索引 以后查找只在索引上操作
而且:
查找时间只和 read 长度有关不和基因组大小有关
这就是它恐怖的地方。
理解它只需要三步:
BWT 做的事情是:
把字符串的所有“旋转版本”排序然后取最后一列
举个小例子:
banana$
排序所有旋转:
$banana a$banan ana$ban anana$b banana$ na$bana nana$ba
取最后一列:
annb$aa
这就是 BWT 结果。
BWT 有两个关键特性:
比如:
aaaaa bbbb cccc
压缩效果很好。
FM-index 不正向找字符串。
它:
从模式串的最后一个字符开始反向查找。
比如找:
ana
它做的是:
一步一步缩小区间。
关键公式:
new_range = C[c] + Occ(c, range)
不用扫描原文本。
只操作:
普通搜索:
O(n × m)
FM-index:
O(m)
因为:
每次只是区间缩小,不扫描文本
像 BWA 这种比对工具需要:
✔ 内存接近文本大小✔ 搜索极快✔ 不用存所有 k-mer
比 hash 表更省空间。
你最近在研究 k-mer 和 hash,对比一下:
FM-index 相当于:
“把整本书当作一个整体索引”
而不是:
“拆成无数 k-mer 再存 hash 表”
FM-index 是:
一个基于 BWT 的压缩全文索引可以在压缩状态下快速查找任意子串搜索复杂度只和模式串长度有关
我可以继续讲:
你想往哪个方向深挖?
Github开源生信云平台 DEMO