Skip to content

BWT 编码

复制本地路径 | 在线编辑
  1. https://zhuanlan.zhihu.com/p/88263062
  2. https://www.cnblogs.com/MTandHJ/p/17795994.html

简介

直接找的参考资料一的图片,讲的很清晰。总之还是那句话:原理不是关键,用的时候再去看。

编码

如下图,编码过程如下,最终保存 L 列即可:

解码

解码过程,直接看参考资料一吧,这里不写了。总之知道最终可以从 L 列恢复出原字符串。

场景

压缩

为什么可以压缩,参考资料二给了很好的例子。原来字符串中频繁出现某个词,比如 'the',则就会有很多的 't' 由于 'hexxxxxxxxt' 的排序聚在一块:

s = 'the_small_or_the_big_or_the_large_or_the_huge_man'
l = 'neeeelegerrrmml_hhhgghiurtttt_bl_as_a___oooa____$h'

这样重复的部分就可以压缩了。

子字符串查找

这里还要用到 FM-Index 方法,但是这里就不细讲了(其实我也没怎么看)。反正知道结合这种方法,可以快速查找子字符串。

他的好处就是构建完这个 BWT 编码之后,可以快速查找字符串了,多次查找比较适合这种场景。不想 KMP 这种每次都要重复比对。即:

BWT + FM-index 适合“对同一个超长文本做海量查询”,而 KMP / BM 适合“一次性匹配、无需建索引”的场景。

但其实 后缀数组 也可以做到。两个比较是:后缀数组更快,但是内存消耗更大。一般而言,在这个时代下,时间比空间更重要。(来自 2026 年的呐喊:但是内存涨价好多啊)

BWT + FM-Index 典型用途:DNA / RNA 测序,比如测得一个小片段,去匹配人类基因组哪个位置。当然也有用后缀数组做的。

Comments