Compression 一个文件可以压缩多少次?

Compression 一个文件可以压缩多少次?,compression,limits,Compression,Limits,我在考虑压缩,它似乎必须要有某种程度的限制才能应用于它,否则它将是一个单字节 所以我的问题是,我可以压缩一个文件多少次: 它没有变小吗 文件是否已损坏 这两点是相同的还是不同的 收益递减点出现在哪里 如何找到这些要点 我不是说任何特定的算法或特定的文件,只是笼统地说。如果算法好,通常压缩一次就足够了。 事实上,多次压缩可能会导致大小增加 你的两点不同 重复压缩,并且在尺寸缩小方面没有改善 这是一个预期的理论条件 重复压缩导致损坏 可能是实现中的错误(或者可能是算法本身) 现在让我们看看一

我在考虑压缩,它似乎必须要有某种程度的限制才能应用于它,否则它将是一个单字节

所以我的问题是,我可以压缩一个文件多少次:

  • 它没有变小吗
  • 文件是否已损坏
这两点是相同的还是不同的

收益递减点出现在哪里

如何找到这些要点


我不是说任何特定的算法或特定的文件,只是笼统地说。

如果算法好,通常压缩一次就足够了。
事实上,多次压缩可能会导致大小增加

你的两点不同

  • 重复压缩,并且在尺寸缩小方面没有改善 这是一个预期的理论条件
  • 重复压缩导致损坏
    可能是实现中的错误(或者可能是算法本身)
现在让我们看看一些例外或变化

  • 加密可以重复应用而不减少大小
    (事实上,有时尺寸会增加)为了增加安全性
  • 图像、视频或音频文件越来越压缩
    将丢失数据(从某种意义上说实际上是“损坏的”)

对于无损压缩,知道通过重新压缩文件可以获得多少次的唯一方法是尝试。这将取决于压缩算法和要压缩的文件

两个文件永远不能压缩到同一个输出,因此不能压缩到一个字节。一个字节如何表示所有可以解压缩到的文件

第二次压缩有时有效的原因是压缩算法不能实现全知的完美压缩。在它必须做的工作和所需的时间之间有一个权衡。您的文件正在从所有数据更改为有关您的数据和数据本身的数据组合

示例

以运行长度编码(可能是最简单有用的压缩)为例

04 04 04 43 43 51 5211字节

该系列字节可以压缩为:

[4] 04[4]43[-2]51 527字节(我将元数据放在括号中)

其中,括号中的正数是重复计数,括号中的负数是一个命令,用于在找到后发出下一个-n字符

在这种情况下,我们可以再尝试一次压缩:

[3] 04[-4]43 fe 51 527字节(fe是您的-2被视为两个的补码数据)

我们一无所获,我们将在下一次迭代中开始增长:

[-7]03 04 fc 43 fe 51 528字节

在一段时间内,每次迭代会增加一个字节,但实际上情况会变得更糟。一个字节只能容纳-128的负数。当文件长度超过128字节时,我们将开始增加两个字节。随着文件变大,增长将变得更糟

有一股逆风吹向压缩程序——元数据。而且,对于真正的压缩器,头钉在文件的开头。这意味着随着每次压缩,文件最终将开始增长


RLE是一个起点。如果您想了解更多信息,请查看(查看文件以查找模式)和(创建字典)。像zip这样的压缩器经常尝试多种算法并使用最好的算法

这里有一些我能想到的多重压缩的例子

  • 我在一家附带光盘的Amiga杂志社工作。自然地,我们把磁盘装到鳃上。我们使用的其中一个工具让您打包一个可执行文件,这样当它运行时,它就会解压缩并自行运行。因为解压缩算法必须存在于每个可执行文件中,所以它必须小而简单。我们经常通过压缩两次获得额外收益。减压是在RAM中进行的。由于读取软盘的速度很慢,我们通常也会得到速度的提高
  • Microsoft支持bmp文件的RLE压缩。此外,许多字处理器都使用RLE编码。RLE文件几乎总是可以通过更好的压缩器显著压缩
  • 我参与的很多游戏都使用了一个小型、快速的LZ77解压器。如果压缩一个大的矩形像素(特别是如果它有很多背景色,或者是一个动画),通常可以压缩两次,效果很好。(原因是?你只有这么多的位来指定回望距离和长度,所以一个大的重复模式被编码成几个片段,而这些片段是高度可压缩的。)

  • 你可以压缩无限次。但是,第二次压缩和进一步压缩通常只会生成比前一次更大的文件。因此,压缩一次以上是没有意义的。

    您可以随心所欲地多次压缩文件。但对于大多数压缩算法,从第二次开始产生的压缩可以忽略不计。

    通常限制为一次压缩。有些算法会导致更高的压缩比,使用一个差的算法,然后再使用一个好的算法,通常会带来改进。但首先使用好的算法是正确的做法

    一组给定数据的压缩量在理论上是有限的。要了解更多这方面的知识,你必须学习

    在文件变小之前,我可以压缩多少次

    一般来说,甚至没有一个。无论您使用什么压缩算法,都必须始终存在一个根本不被压缩的文件,否则您可以一直重复压缩,直到达到1
    111111111111111
    
    15 X '1'
    
    15 X '1'
    
    
    def compress(digitString):
        if digitString=="":
            raise "already as small as possible"
        currentLen=len(digitString)
        if digitString=="0"*currentLen:
            return "9"*(currentLen-1)
        n=str(long(digitString)-1); #convert to number and decrement
        newLen=len(n);
        return ("0"*(currentLen-newLen))+n; # add zeros to keep same length
    
    #test it
    x="12";
    while not x=="":
        print x;
        x=compress(x)