Algorithm 哪种算法最适合Burrows-Wheeler变换?

Algorithm 哪种算法最适合Burrows-Wheeler变换?,algorithm,compression,burrows-wheeler-transform,Algorithm,Compression,Burrows Wheeler Transform,似乎许多实现BWT的压缩器将其与算术编码或哈夫曼编码结合使用。(请随意提名更多,特别是如果他们更好的话。) 我的第一个问题是:为什么像LZW或LZSS这样的字典编码器在BWT中使用会更糟糕 我的第二个问题是:哪一个是最好的全方位算法 BWT使用所有大小的上下文,而实际的LZ实现很难使用小于3的上下文 BWT从块内的每个匹配中获益,而普通LZ实现仅在前瞻窗口中查找匹配 但在许多情况下,LZ并不是一个更糟糕的选择。LZ是一种在线算法,可以处理流,而BWT必须处理大数据块,并且需要大量内存。LZ的减压

似乎许多实现BWT的压缩器将其与算术编码或哈夫曼编码结合使用。(请随意提名更多,特别是如果他们更好的话。)

我的第一个问题是:为什么像LZW或LZSS这样的字典编码器在BWT中使用会更糟糕

我的第二个问题是:哪一个是最好的全方位算法

  • 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转换有许多实用的LIB,并且大多数LIB共享相同的接口。只需在项目中使用其中一种算法。

    对于每种类型的数据和每台计算机,都没有最好的算法。这在很大程度上取决于被压缩的数据,取决于计算机有多少RAM,取决于CPU缓存的大小以及其他一些因素。回答得好!无额外内存的线性时间SA构造的最新算法是SACA-K: