哪种算法最适合 Burrows-Wheeler 变换?
Posted
技术标签:
【中文标题】哪种算法最适合 Burrows-Wheeler 变换?【英文标题】:Which algorithm is most suitable for Burrows-Wheeler Transform? 【发布时间】:2013-03-31 10:24:44 【问题描述】:似乎许多实现 BWT 的压缩器将它与算术编码或霍夫曼编码结合使用。 (请随意提名更多,特别是如果他们更好的话。)
我的第一个问题是:为什么像 LZW 或 LZSS 这样的字典编码器与 BWT 一起使用是一个更糟糕的选择?
我的第二个问题是:哪个是最好的全能算法?
【问题讨论】:
对于每种类型的数据和每台计算机,没有最佳算法。很大程度上取决于要压缩的数据、计算机有多少 RAM、CPU 缓存的大小以及许多其他因素。 【参考方案1】:-
BWT 使用所有大小的上下文,而实际的 LZ 实现几乎不能使用大小小于 3 的上下文。
BWT 受益于块内的每个匹配项,而普通 LZ 实现仅在前向窗口中查找匹配项。
但在许多情况下,LZ 并不是一个更糟糕的选择。 LZ 是一种在线算法,可以在流上工作,而 BWT 必须在大块上工作,并且消耗大量内存。 LZ的解压效率很高,而BWT至少还需要5n的额外空间。
BWT 的性能与后缀排序有关。实用的后缀排序算法有很多:MSufSort/DivSufSort/Archon/QSufSort/DeepSwallow,理论上O(n)时间最优算法:SA-IS/SA-DS。
PS/ 如果您正在编写基于 BWT 的压缩器,请多注意编码 BWT 的输出,而不是 BWT 本身,因为有许多用于 BWT 转换的实用库,并且它们中的大多数共享相同的接口。只需在您的项目中使用其中之一即可。
【讨论】:
好答案!无需额外内存的线性时间 SA 构建的最新算法是 SACA-K:code.google.com/p/ge-nong以上是关于哪种算法最适合 Burrows-Wheeler 变换?的主要内容,如果未能解决你的问题,请参考以下文章