压缩算法如何将其符号与实际文件内容区分开来



我想知道压缩算法实际上是如何编写注释的。假设"4x4x"是"4x"的4倍。

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

23*("文本"),重复的文本为34*("某物")

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

压缩此字符串后:

"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") ."

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

大致有三种方法:

  1. 一切都是一种特殊的象征。因此,文本将被编码为1x"压缩"、1x"程序"、1x"标签"等等

  2. 逃跑。这是指使用一个特殊的字符来表示一个符号。因此,4x("text")将表示为$4x("text"),而$的存在意味着接下来是一个特殊的压缩序列。当然,为了实现这一点,需要一个技巧来允许我们在普通文本中包含$。诀窍很简单:$1x("$")

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

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

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

这样,"4x"(或任何其他看起来像重复计数的值)就不会被视为重复计数,因为它被捕获为要重复的文本(尽管只有一次)。并且文本("text")的前面没有重复计数,因此它将以不变的方式经历解压缩阶段。

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

最新更新