前言
BWT本质是一种无损块排序 Block-sorting Lossless算法,仅对数据进行变换,并不会进行压缩(大佬的英文ppt介绍)
但是它能使得,在使用同一种压缩算法的前提下,变换后的字符串大概率会得到更高的压缩率,所以使得由其原理衍生出来的许多算法都应用于数据压缩领域中
至于其具体操作步骤、原理讲解的文章已有很多,我这里就不再赘述了,仅推荐一篇约翰斯·霍普金斯大学怀廷工程学院的ppt(英文),其中还讲解了 BWT 与 FM-Index 的后缀数组的联系,对于想了解BWT在其他数据结构中的应用或FM-Index原理的同学应该很有帮助
核心理念
在此我将其核心拆分成2个W
1. What’s block-sorting lossless?(变换原理)
一句话:
BWT的结果,是利用已知所有出现字符及每个字符的前关系,按照字典序排列所有字符的顺序,输出每个字符对应前一个字符的结果
换句话说:
BWT的结果包含了还原成原序列的所有信息
正常来说排序就会丢失掉原来的顺序信息,这只有一条与原序列等长的结果,怎么能还原呢?
拆分理解:
- 拿到字符串的同时,我们就能知道有哪些字符,以及每个字符出现的次数
- 如果把每个字符都看成独一无二的,那么可把字符串想象成一条单向链表,每个字符都指向其唯一的前置字符(
前后关系前关系) - 如果我们有办法在排序后的字符串中保留这种关系 ,那么再加上最后一个字符(单向链表的头),就可以推出原来的整个字符串(类似链表的遍历)
- 关系拆分:
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个字符位置,等于后缀数组中第i项SA[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出现的位置对应的范围中
由此,后续压缩时,字符串的局部性就能更好地被利用
2032

被折叠的 条评论
为什么被折叠?



