BWT压缩算法及FM搜索算法详解

 BWT压缩算法其经典地位无可撼动, 思想真是个奇妙的东西, 废话不多说, 让我们来看看她的奇妙之处吧。


假设有一串字符串S="acaacg", 长度为6, 如果直接对此串进行压缩, 可能是a 1, c 1, a 2, c 1, g 1, 对于更长的串, 由于其随机性, 使得同一个字母的大量重复更多, 因此我们需要一种更好的办法,既能提高压缩效率同时可以完美还原原序列, BWT算法这就登场了:

1, 首先将原字符串开头添加一个结束字符,一般取$, 得到S'="$acaacg",长度为 7

2, 将S'往右轮转,得到一个数组M,它只是一个中间产物, 但是对于后面的理解会有帮助

 $acaacg

 g$acaac

 cg$acaa

 acg$aca

 aacg$ac

 caacg$a

 acaacg$

3, 紧接着对这个数组按照字典序排序,得到 M',后续的处理都是基于这个数组,( 请开动您的脑筋, 来一次天马星空吧)

 $acaacg

 aacg$ac

 acaacg$

 acg$aca

 caacg$a

 cg$acaa

 g$acaac

4,这里我们定义M' 的第一列为F="$aaaccg", 长度为7,这个看起来挺适合压缩, 但我们的目的还要还原, 而F不能还原成S(自己想想为什么?),

在定义M' 的最后一列为L="gc$aaac",长度为7,g 1, c 1, a 3, c 1, 发现这个序列更有规律,较原序列更易压缩, 这里要说明下矩阵M' 两个性质,

    A. L的第一个元素是S中的最后一个元素

    B.  对于M' 中的每一行(第一行除外)第一个元素都是最后一个元素在原序列中的下一个元素。(这句请多想想), 例如M' 第2行a, 该行最后一个字母是c, 再回到S中可发现,a就是紧跟c后面的一个字符。也就是说,对于文本块而言,同一行中F是L的下一个元素,L是F的前一个元素。

至此, 压缩初步完成,即得到L序列, 后面更完整的压缩是根据L更容易还原的特性来处理, 我们先讲到这里。

5, 现在我们就从L开始还原了,还原之前我们要对M' 矩阵进行统计, F中每个字符(相同字符取第一个)前面有多少个字符,$不计入,总共三个字母a, c, g, 于是得到SF={1,4,6};L中每个字母之前有多少个与自己相同的字母,有这些字母 g, c, a, a, a, c,得到SL={0,0,0,1,2,1},

现在就可以还原了, 首先取L的第一个字母g, 根据性质A它是原序列中的最后一个字母, 再根据B性质,依次还原每个字母的前一个字母,于是为了得到g的前一个字母,我们要找到g开头的序列,M'的最后一行, 然后找到该行最后一个字母c, 就是原序列g的前一个字母,得到cg, 继续找c的前一个字母, 找到以c开头的行,发现有两行, 怎么办, 就要用到刚才统计好的数组了, 刚才的c前面有一个c, 故现在得到的两行中的第二行是我们要找的目标行, 于是c前面的字母就是a,得到acg, 这个a前面有两个a, 所以我们找到M' 中的第四行,那么a的前一个字母就是a,得到aacg,依照此规律开动您的小脑袋继续探索吧。 (如果觉得文字说明太乱,请看下面图示


上面所讲全是理论性质的, 有兴趣的朋友可以动手谢谢代码, 同时可以参考网上其他朋友已经实现了的代码。


关于FM搜索算法, 未完待续, 恳请各位前辈们多多批评指正, 本人一定多学习借鉴, 谢谢。




  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值