Algorithm 文本文件中数据的顺序是否会影响其压缩比?

Algorithm 文本文件中数据的顺序是否会影响其压缩比?,algorithm,compression,zip,Algorithm,Compression,Zip,我有两个大的文本文件(准确地说是csv)。两者的内容完全相同,只是一个文件中的行的顺序不同,而另一个文件中的行的顺序不同 当我压缩这两个文件(以编程方式,使用DotNetZip)时,我注意到其中一个文件总是相当大——例如,一个文件比另一个文件大7 MB- 我的问题是: 文本文件中数据的顺序如何影响压缩?为了保证最佳压缩比,可以采取哪些措施我认为将相似的行组合在一起(至少在我使用的ZIP文件的情况下)会有助于压缩,但我不熟悉不同压缩算法的内部结构,我希望能对这个主题进行快速解释 从某种意义上讲,哪

我有两个大的文本文件(准确地说是csv)。两者的内容完全相同,只是一个文件中的行的顺序不同,而另一个文件中的行的顺序不同

当我压缩这两个文件(以编程方式,使用DotNetZip)时,我注意到其中一个文件总是相当大——例如,一个文件比另一个文件大7 MB-

我的问题是:

文本文件中数据的顺序如何影响压缩?为了保证最佳压缩比,可以采取哪些措施我认为将相似的行组合在一起(至少在我使用的ZIP文件的情况下)会有助于压缩,但我不熟悉不同压缩算法的内部结构,我希望能对这个主题进行快速解释


从某种意义上讲,哪种算法能够更好地处理这种情况,从而在不考虑数据顺序的情况下实现最佳的平均压缩?

从某种意义上讲,它是衡量文件压缩程度的标准。所以,是的,顺序肯定很重要。作为一个简单的例子,考虑一个充满了值<代码> ABCFDGH…ZABCD…Z的文件。它可以很好地压缩大多数算法,因为它是非常有序的。但是,如果完全随机排列顺序(但保留每个字母的相同计数),则它具有完全相同的数据(尽管“含义”不同)。它是不同顺序的相同数据,不会进行压缩


事实上,因为我很好奇,我就试过了。我在一个数组中填充了100000个字符
a-z
重复,将其写入一个文件,然后“随机”洗牌该数组并再次写入。第一个文件压缩到394字节(小于原始大小的1%)。第二个文件压缩到63582字节(超过原始大小的63%)

典型的压缩算法如下所示。查看一块数据。如果它与其他最近看到的块相同,则不要逐字输出当前块,而是输出对该较早块的引用

当相似的块靠得很近时,它肯定会有所帮助。该算法只保留有限数量的回望数据,以保持合理的压缩速度。因此,即使一个数据块与另一个数据块相同,如果该旧数据块太旧,它也可能被冲走。

已经回答了“如何”。要回答您的“哪个”问题:

匹配窗口越大,算法对顺序的敏感度越低。然而,所有的压缩算法在一定程度上都是敏感的


gzip有一个32K窗口,bzip2有一个900K窗口,xz有一个8MB窗口。xz的窗口最大可达64MB。所以xz对订单最不敏感。距离更远的匹配将需要更多的位来编码,因此无论窗口大小如何,您都可以使用排序记录获得更好的压缩效果。短窗口只会排除远距离匹配。

确实如此。如果输入模式是固定的,则有100%的机会预测每个位置的字符。考虑到双方都知道他们的数据流(本质上相当于说他们知道固定模式),实际上不需要进行任何通信:完全压缩是可能的(要通信有限长度的字符串,而不是无限长度的流,您仍然需要对长度进行编码,但这有点离题). 如果另一方不知道模式,您需要做的就是对其进行编码。完全压缩是可能的,因为您可以用有限的数据量对无限的流进行编码

在另一个极端,如果您有完全随机的数据-因此流可以是任何内容,下一个字符始终可以是任何有效字符-则不可能进行压缩。流必须完整地传输,以便另一方能够重建正确的流

有限字符串有点棘手。由于有限字符串必然包含每个字符的固定数量的实例,一旦开始读取初始标记,概率就必须改变。可以将某种顺序读入任何有限字符串


不确定这是否回答了您的问题,但它从理论上解决了一些问题。

谢谢。你知道有什么算法在数据被洗牌的情况下更有效吗?我不确定。我唯一真正玩得最多的是zlib(我认为它类似于旧pkzip时代的deflate算法……我认为)。我的猜测是,通用算法通常会受到“无序”数据的大致相同的影响。我怀疑它需要一个高度特定的算法来识别某些案例。例如,如果您预先知道数据将以某种方式被洗牌,则可以在压缩/压缩数据之前对其进行预处理。在您的示例中,假设字符a-z以相等的数字出现,但以随机顺序出现,您需要5位而不是8位来编码下一个出现的字符。(事实上,您有26个字符,5位足以编码32个不同的值。)因此对于100000个字符,您需要100000*5/8=62500字节。您的63582字节文件可能就是这样,再加上一些元数据和一个表来指示每个5位值代表的字符。有关更多详细信息,请查阅“哈夫曼编码”。+1:这是一个很好的信息。你的名字似乎“可疑地”熟悉。你是zlib Adler吗?很酷。谢谢你为那个图书馆所做的工作。非常好。