压缩算法如何区分它们的符号和实际文件内容?

How do compression algorithms distinguish their symbols from actual file content?

我想知道压缩算法实际上是如何写他们的笔记的。假设“4x4x”表示“4x”的 4 倍。

如果算法像这样标记重复的字符会怎样:

23*("text") 重复的文本是 34*("something")

程序如何知道这不是重复文本的标签,而是实际文本。我不知道如何更好地解释这个。

压缩此字符串后:

"Compression programs label how many times string is repeated like this: 4x("text"), this is repeated repeated repeated ."

你会得到:

"Compression programs label how many times string is repeated like this: 4x("text"), this is 3x("repeated") ."

算法如何知道一个压缩一个?

处理此问题的通常方法是(在压缩期间)识别原始文本包含会导致解压缩问题的字符序列,并以某种方式 "escape" 它。有很多方法可以做到这一点,但对于您发布的示例来说,最简单的方法可能是将文本压缩为:

"Compression programs label how many times string is repeated like this: 1x("4x")("text"), this is 3x("repeated").

这样,“4x”(或任何其他可能看起来像重复计数的内容)不会被视为重复计数,因为它已被捕获为要重复的文本(尽管只有一次)。并且文本 ("text") 没有以重复计数开头,因此它将通过解压阶段不变。

请注意,此特定编码方案还有其他问题(例如本身包含双引号的重复文本)。但是所有这些问题都可以通过适当的转义处理来解决。

大致有3种方法:

  1. 一切都是特殊符号。因此,文本将被编码为 1x"Compression"、1x"programs"、1x"label" 等等。

  2. 转义。这是指用一个特殊的字符来表示一个符号。因此,4x("text") 将表示为 x("text"),而 $ 的存在意味着后面是一个特殊的压缩序列。当然,为了让它起作用,需要一个技巧来允许我们在普通文本中包含 $。技巧很简单:x("$").

  3. 词典。您想到的压缩算法是极其简单的 "Run Length Encoding" 算法的变体。 (查一下。)这个算法实际上一无是处,现在很少使用。像 LZW 这样的现代压缩算法要复杂得多,它们使用字典,其中每个输入组合都映射到要输出的字节串。完整的解释太长,无法包含在答案中,但请随时查找 LZW。