两句话讲解BWT(Burrows Wheeler Transform)核心

前言

BWT本质是一种无损块排序 Block-sorting Lossless算法,仅对数据进行变换,并不会进行压缩(大佬的英文ppt介绍
但是它能使得,在使用同一种压缩算法的前提下,变换后的字符串大概率会得到更高的压缩率,所以使得由其原理衍生出来的许多算法都应用于数据压缩领域

至于其具体操作步骤、原理讲解的文章已有很多,我这里就不再赘述了,仅推荐一篇约翰斯·霍普金斯大学怀廷工程学院的ppt(英文),其中还讲解了 BWTFM-Index 的后缀数组的联系,对于想了解BWT在其他数据结构中的应用或FM-Index原理的同学应该很有帮助

核心理念

在此我将其核心拆分成2个W

1. What’s block-sorting lossless?(变换原理)

一句话:

BWT的结果,是利用已知所有出现字符每个字符的前关系,按照字典序排列所有字符的顺序,输出每个字符对应前一个字符的结果
换句话说:
BWT的结果包含了还原成原序列的所有信息

正常来说排序就会丢失掉原来的顺序信息,这只有一条与原序列等长的结果,怎么能还原呢?
拆分理解:

  1. 拿到字符串的同时,我们就能知道有哪些字符,以及每个字符出现的次数
  2. 如果把每个字符都看成独一无二的,那么可把字符串想象成一条单向链表,每个字符都指向其唯一的前置字符(前后关系 前关系
  3. 如果我们有办法在排序后的字符串中保留这种关系 ,那么再加上最后一个字符(单向链表的头),就可以推出原来的整个字符串(类似链表的遍历)
  4. 关系拆分:
    4.0 利用BWM(BW矩阵)将这种关系拆分成两部分:在F列中每个字符与L列中的字符(前置字符)的对应关系在L列中每个字符与其在F列中的位置的对应关系
    4.1 ⭐前一部分不用刻意保留:因为结果就是L列,而排序BWM得到的F列必定是所有字符的字典序排列,也就是由第1点我们就已经能重构出F列,即F列与L列的对应关系已经得到了
    :这里就是BWT与后缀数组的联系:BWT(i) = T[SA[i] - 1]
    (BWT结果的第i个字符位置,等于后缀数组中第iSA[i]对应位置减一)
    4.2 ⭐后一部分也不用刻意保留:在L列中字符的顺序由它们对应的后置字符顺序决定,而在F列中它们的顺序也是由它们对应的后置字符顺序决定的,这种决定关系在整个串中都是统一的(right-context sorted),这保证了每字符在所有该字符中的相对位置在F列与L列中是一样的(稳定
    :这里就是LF-mapping:LF(i) = C(T[i]) + BWT.rank(T[i], i)
    T[i]字符在F列的位置,等于小于该字符的字符数,加上L列到i位置为止该字符出现次数)
    4.3 结束字符$的加入,保证了BWT结果的第一个字符一定是原字符串的最后一个字符(链表开始)

至此,无额外信息的 (其实并不是无额外信息,只是省略掉了F列默认按字典序排列的处理方式) 无损排序就此完成(完结撒花 ο(=•ω<=)ρ⌒☆

名词解释:
block-sorting:因为BWM排序时,对于每字符来说,是把它们对应的所有前一个字符集合,按其后一个字符的顺序进行排序,所以可理解为:一种字符为一个block,每个block内进行排序,再将所有block按首字母字典序排序
lossless:由上面可知,字符间对应关系并未丢失,每个字符都能有且仅有一次地被遍历到,整个字符串能还原,就是无损

2. Why does it improve compression ratio?(提升压缩率原理)

一句话:

block-sorting,相当于在全局范围内,对同一个字符的所有前置字符进行了一次富集

利用排序,F列按照字典序排列
如果某两个字符的一个组合AB在原字符串中经常出现,那么在L列中,A将从全文的出现范围被“聚集”到L列中B出现的位置对应的范围
由此,后续压缩时,字符串的局部性就能更好地被利用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值