压缩算法如何区分它们的符号和实际文件内容?
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种方法:
一切都是特殊符号。因此,文本将被编码为 1x"Compression"、1x"programs"、1x"label" 等等。
转义。这是指用一个特殊的字符来表示一个符号。因此,4x("text")
将表示为 x("text")
,而 $
的存在意味着后面是一个特殊的压缩序列。当然,为了让它起作用,需要一个技巧来允许我们在普通文本中包含 $
。技巧很简单:x("$")
.
词典。您想到的压缩算法是极其简单的 "Run Length Encoding" 算法的变体。 (查一下。)这个算法实际上一无是处,现在很少使用。像 LZW 这样的现代压缩算法要复杂得多,它们使用字典,其中每个输入组合都映射到要输出的字节串。完整的解释太长,无法包含在答案中,但请随时查找 LZW。
我想知道压缩算法实际上是如何写他们的笔记的。假设“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种方法:
一切都是特殊符号。因此,文本将被编码为 1x"Compression"、1x"programs"、1x"label" 等等。
转义。这是指用一个特殊的字符来表示一个符号。因此,
4x("text")
将表示为x("text")
,而$
的存在意味着后面是一个特殊的压缩序列。当然,为了让它起作用,需要一个技巧来允许我们在普通文本中包含$
。技巧很简单:x("$")
.词典。您想到的压缩算法是极其简单的 "Run Length Encoding" 算法的变体。 (查一下。)这个算法实际上一无是处,现在很少使用。像 LZW 这样的现代压缩算法要复杂得多,它们使用字典,其中每个输入组合都映射到要输出的字节串。完整的解释太长,无法包含在答案中,但请随时查找 LZW。