生信之旅

扫码分享下吧!
分享

BWM算法浅析-FM(二)

注意:由于用语言不好描述,故使用图表结合的方法进行解释,点击图可直接查看原图,点开后右上角有关闭按钮!

一、FM-index 简介

fm-index是一种结合到BWT和小的辅助数据结构中的索引,它的核心就是BWM中的F与L(不了解的可查看我的上一篇文章)。虽然BWM与后缀数组有关,但是不能使用与后缀数组相同的查询方法,因为字符串的中间部分我们并没有进行保存。这里我们使用上一篇文章所用的字符串S(ACGTAA)作为示范。见下图所示,其中红线部分未保存。
FM-index-1

二、FM Index 查询

当我们需要查询子字符串P在字典序排序矩阵M中行的范围时,我们可以以P的最短后缀开始查找,直到P扩展完成或者行的范围为空为止。例如:

第一次查找
FM-index-2
第二次查找
FM-index-3
现在我们找到了AA后缀的行,接下来,我们开始查找TAA后缀的行
FM-index-4
FM-index-5
当子字符串P不在S中时,我们在L列中是找不到下一个字符的,例如:
FM-index-6

三、FM-index 存在的问题及解决方法

在上面介绍的方法中,还存在这几个问题:

  1. 扫描字符速度较慢,算法时间O(m);
  2. 存储字符的出现次数需要大量的内存空间;
  3. 需要确定字符串P在S中的具体位置

是否有算法时间O(1)的方法进行排名的计算呢?

快速计算排名

FM-index-7
上诉方法虽然时间复杂度是O(1),但是需要额外的空间来存储排名信息,下面我们考虑在存储排名信息时,仅存储部分信息,以减少空间消耗,为了追踪到所有排名信息,每个一段距离设置一个检查点(checkpoints)
FM-index-8
如何计算排名呢?
FM-index-9
当前已经解决的问题有:
通过存储字符出现的次数和设置检查点,我们解决了扫描字符速度过慢,存储需要消耗过大的存储的问题
目前还需要确定字符串P在S中的具体位置
FM-index-10
由于SA也需要大量空间来进行存储,这里我们仍然使用存储部分数据的方法来减少所需存储。
FM-index-11

所以第6行所对应的SA序号值x = 1(第四行SA的序号值)+2(回溯步数) = 3
至此,所有问题均解决了! 

参考

A block sorting lossless data compression algorithm

版权声明:本文转载请注明出处!

最新评论:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

captcha

公告栏

有任何问题均可以在文章页面留言!或者邮件 burning@burning.net.cn 欢迎关注微信公众号 “生信之旅”,每天均可在菜单栏领取外卖红包、支付宝红包!最高20元!

服务器推荐

欢迎关注公众号

欢迎关注生信之旅