哪种算法最适合 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 变换?的主要内容,如果未能解决你的问题,请参考以下文章

哪种聚类算法最适合聚类一维特征?

哪种算法以及哪种超参数组合最适合对这些数据进行聚类?

哪种算法最适合在树中查找 LCA?

交易数据的数据挖掘分类——哪种算法最适合?

确定哪种方法最适合比较排序算法。小型数据收集的分治或招聘问题

Burrows-Wheeler 压缩