我是新的编码,所以我试图理解的基础知识。我偶然看到一个描述无损文本压缩技术的文档,在这个文档中有一个图表说明了他们的压缩是如何工作的。它是这样工作的:
Source -> BWT -> MTF -> RLT -> Proprietary Entropy Encoder
我不明白为什么他们会在移动到前变换后使用运行长度变换,这对我来说似乎并不有效。据我了解,MTF本身不会产生很多运行,因此使用RLT后记是没有用的。
请解释一下。
在BWT之后的MTF的目标是缩小符号的范围,这有利于熵编码。MTF用它们的秩替换符号,由于BWT产生的重复,通常秩很小。在此之后可以应用零长度编码,因为MTF可能会产生很多0(这只是RLE的一个特殊情况,其中只有0的运行按长度编码)。
查看https://github.com/flanglet/kanzi-cpp获取实现示例。您可以使用Block编解码器运行BlockCompressor,无论是否使用MTF+ZLE。
效率不高。
这可能是一篇关于BWT的旧论文。当时,使用RLE(运行长度编码器)是提高速度的常用技巧。此外,RLE不仅在BWT之后使用,而且在BWT之前使用,以加快BWT阶段。同样的逻辑可以应用于熵编码器,但它不太可能提供那么多的好处。
现在,这个把戏完全过时了。在BWT之前,您可能会发现某种LZP预处理,特别是对于长距离匹配(超出块大小),在速度改进方面与RLE的意图大致相同,但功能更强大。MTF也被完全取代了,因为它太占用CPU了,而且效率不高。