是否有一个已知的最大值,可以压缩多少个0和1?


38

很久以前,我读过一篇报纸上的文章,其中一位教授说,将来我们将能够将数据压缩到仅两位(或类似的东西)。

这当然是不正确的(可能是我对他确切说的话的记忆是不正确的)。可以理解的是,将0和1的任何字符串压缩为两位都是不切实际的,因为(即使在技术上可行),太多不同种类的字符串最终会压缩为相同的两位(因为我们只有'01 '和'10'可供选择)。

无论如何,这让我想到了根据某种方案压缩任意长度的0和1的字符串的可行性。对于这种字符串,字符串长度(0与1之间的比率可能无关紧要)与最大压缩之间是否存在已知关系?

换句话说,有没有一种方法可以确定可压缩为0和1的字符串的最小(最小)长度?

(在这里,我对数学上的最大压缩感兴趣,而不是当前在技术上可能实现的最大压缩。)


7
我们还将有“ 00”和“ 11”可供选择。但是参数是相同的,如果使用这些参数,则只能压缩四个不同的字符串。
RemcoGerlich

3
mathoverflow.net/q/160099/34859:请参阅此处遵循鸽子原理,总是会有无数个无法压缩的字符串...不管使用哪种算法。(请参见问题
ARi

4
压缩取决于您对数据结构的了解。有这篇关于压缩棋,显示了如何将知识有助于提高压缩。
2015年

1
您能澄清一下吗:压缩可以是“有损的”,也可以是“无损的”(或可能同时使用两者的“混合”压缩)。您是在谈论仅使用“无损”压缩方法的最大压缩,还是要包括(允许)使用“有损”压缩方法。换句话说,我猜有3种可能性:寻找“最大压缩”,其中(1)必须始终能够完全像压缩前一样对数据进行解压缩,(2)必须能够对数据进行解压缩,但是允许一些“丢失”(3)并不需要能够解压缩数据。
凯文·费根

@KevinFegan,您好,在这种情况下,它必须是选项1:“必须始终能够完全像压缩之前一样对数据进行解压缩”
x457812,2015年

Answers:


45

Kolmogorov复杂度是数学上形式化的一种方法。不幸的是,计算字符串的Kolmogorov复杂度是一个无法解决的问题。另请参阅:逼近Kolmogorov复杂度

如果您分析字符串的来源而不是字符串本身,则可能会获得更好的结果。换句话说,通常可以将源建模为一个概率过程,该过程根据某种分布随机地选择字符串。然后,该分布的熵告诉您数学上可能的最佳压缩率(最高为一些小的加性常数)。


关于不可能进行完美压缩,您可能还会对以下内容感兴趣。


但是,压缩是估计熵的技术之一。压缩和熵可以成为同一事物的两个方面吗?
Paul Uszak

1
@PaulUszak,是的,它们之间有着密切的联系:例如,参见香农定理。但是,请注意:评论仅应用于对帖子进行改进/说明,而不是提出后续问题。要提出新问题,请使用页面右上方的“询问问题”链接。
DW

35

对于任何给定的字符串,都有一种压缩方案将其压缩为空字符串。因此,它是没有意义的问了多少串可以被压缩,而是多少(或分布字符串)可以压缩到平均。通常,给定个字符串的集合,在最坏的情况下,任何压缩方案都至少需要位左右才能对该集合中的字符串进行编码。log 2 NNlog2N

同样,在许多情况下,我们并不关心精确的重建。这称为有损压缩,是音乐和视频的压缩方式。在这种情况下,上述下限不成立,但您可以提出其他下限。


1
@Veedrac不,您正确理解我。您的论点(或多或少)显示,对于字符串,任何编码方案都需要位用于某些字符串。这里的旁通道是减压程序。log 2 NNlog2N
Yuval Filmus

27

这是一个简单的方案,可以无损地压缩任意位串,最小的结果只有一位:

如果该字符串与存储在我的计算机硬盘上的AAC格式的贝多芬第九交响曲第四乐章的录制完全相同,则输出为单个位“ 0”。

如果该字符串是其他任何字符串,则输出为单个位“ 1”,后跟原始字符串的相同副本。

这种方案将一个可能的输入减少到恰好一位,并增加每隔一个输入的长度。有一个普遍原则:如果压缩算法可以将任何输入字符串映射到压缩字符串,并且有一个匹配的解压缩算法可以将任何压缩字符串映射回原始字符串,并且压缩算法将任何输入映射到较短的字符串,那么它必须将一些输入字符串映射到更长的字符串。


2
做好答案的清晰明了。值得注意的是,这类似于良好的压缩算法尝试执行的操作-对于给定的输入域,请尝试缩短最常见的输入类型,以换取不常见的输入被加长。
JBentley

6

对于您可以提出的每种压缩方案,都有可能产生不可压缩的数据。因此,即使您的压缩方案对于某些类型的数据非常有效,也永远不会始终如一地压缩到一定比例。

为特定的压缩算法生成不可压缩数据的示例的方法很简单:获取任何类型的数据,并反复通过压缩算法运行它,直到大小不再减小为止。

因此,一串比特的可压缩性实际上并不是字符串长度的函数,而是其相对于压缩算法的复杂性。


欢迎!请注意,这仅适用于无损压缩。有损压缩可以压缩所有字符串(至少,只要您接受算法“返回空字符串”作为有损压缩算法即可;-))。
David Richerby,2015年

@DavidRicherby当然是的。但是我从这个问题中得到的印象是,OP在询问无损压缩,因为讨论有损方案的最大压缩没有多大意义。有损压缩的概念固有于您将其发挥到无法使用的极限的想法。
2015年

是的,我认为这是一个合理的解释。
David Richerby,2015年

-2

企业备份系统使用一种有趣且完全不同的算法。这个想法是,如果您的公司拥有10,000台计算机,那么许多这样的计算机将包含许多相同的文件。例如,发送给公司中每个人的电子邮件最终可能会在每个硬盘驱动器上以相同的文件结尾。

因此,尝试备份文件的备份系统显然应该尝试压缩文件以节省空间,但是首先备份系统会检查是否已经保存了绝对相同的文件!因此,备份系统要做的只是备份磁盘驱动器上的备份系统文件编号1,487,578,而不是备份任何内容

例如,当10,000个用户都安装了相同的操作系统和应用程序时,此功能特别有效。对于单用户而言,它根本不是很有用。


4
这很有趣,但是我看不出它如何回答这个问题。这个问题要求限制压缩,而不是对企业备份的一般讨论。
David Richerby,2015年

这称为重复数据删除,是使用哈希完成的。为磁盘上的每个块存储128位哈希需要大量RAM。ZFS可以这样做,以使某些块有机会共享一些写时复制存储空间。但是,这种压缩问题(您正在尝试压缩需要随机访问的海量数据集,而对于正常的流压缩来说,这种改变的速度太快了,但是具有块级冗余性)与解决此问题无关题。
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.