似乎许多实现BWT的压缩器将其与算术编码或霍夫曼编码结合使用。(请随意提名更多,特别是如果他们更好的话。)
我的第一个问题是:为什么字典编码器,如LZW或LZSS,是与BWT一起使用的更糟糕的选择?
我的第二个问题是:哪个是最好的全能算法?
- BWT使用所有大小的上下文,而实际的LZ实现几乎不能使用小于3的上下文。
- BWT受益于块内的每个匹配,而正常的LZ实现只在forward -forward窗口中查找匹配。
但在许多情况下,LZ并不是一个更糟糕的选择。LZ是一种在线算法,可以在流上工作,而BWT必须在大块上工作,并且需要大量内存。LZ的解压缩非常有效,而BWT仍然需要至少5n的额外空间。
BWT的性能与后缀排序有关。有许多实用的后缀排序算法:MSufSort/DivSufSort/Archon/QSufSort/DeepSwallow,以及理论上最优的O(n)时间算法:SA-IS/SA-DS。
PS/如果你正在编写一个基于BWT的压缩器,请更多地关注编码BWT的输出,而不是BWT本身,因为有许多实用的BWT转换库,并且大多数库共享相同的接口。