zip压缩背后的概念是什么?我可以理解删除空白空间等的概念,但可能需要添加一些内容来说明在解压缩过程中需要添加多少/哪个空闲空间?
压缩字节流的基本过程是什么?
答案 0 :(得分:24)
一个好的起点是查找Huffman压缩方案。霍夫曼背后的基本思想是,在给定文件中,某些字节比其他字节更频繁出现(在明文文件中,许多字节根本不会出现)。而不是花费8比特来编码每个字节,为什么不使用较短的比特序列来编码最常见的字符,而使用较长的序列来编码较不常见的字符(这些序列通过创建霍夫曼树来确定)。
一旦你掌握了使用这些树来根据字符频率对文件进行编码/解码,想象一下你开始处理字频 - 而不是将“它们”编码为4个字符的序列,为什么不考虑它呢?由于其频率而成为单个字符,允许在霍夫曼树中为其分配自己的叶子。这或多或少是ZIP和其他无损类型压缩的基础 - 它们在文件中寻找常见的“字”(字节序列)(如果足够常见,则包括仅1个字节的序列)并使用树对它们进行编码。然后,zip文件只需要包含树信息(每个序列的副本及其出现的次数),以允许重建树并解析文件的其余部分。
跟进:
为了更好地回答原始问题,无损压缩背后的想法不是删除空白空间,而是删除 redundent 信息。
如果你创建了一个存储音乐歌词的数据库,你会发现很多空间被用来存储多次重复的合唱。你可以简单地在合唱线的第一个实例之前放置单词CHORUS,然后每次重复合唱时,只需使用CHORUS作为占位符(实际上这几乎就是这个想法)在LZW压缩之后 - 在LZW中,歌曲的每一行都会显示一个数字。如果一首行在歌曲中稍后重复,而不是写出整行,只显示数字)
答案 1 :(得分:6)
基本概念是,不是使用8位来表示每个字节,而是使用更短的表示来表示更频繁出现的字节或字节序列。
例如,如果您的文件仅包含重复十六次的字节0x41(A
),那么不要将其表示为8位序列01000001
将其缩短为1位序列0
。然后该文件可以由0000000000000000
表示(十六0
s)。那么重复十六次的字节0x41
的文件可以由重复两次的字节0x00
组成的文件表示。
所以我们这里有的是,对于这个文件(0x41
重复十六次),位01000001
不会在位0
上传递任何其他信息。因此,在这种情况下,我们丢弃无关的位以获得更短的表示。
这是压缩背后的核心理念。
作为另一个例子,考虑八字节模式
0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48
现在重复2048次。遵循上述方法的一种方法是使用三位表示字节。
000 0x41
001 0x42
010 0x43
011 0x44
100 0x45
101 0x46
110 0x47
111 0x48
现在我们可以用00000101 00111001 01110111
表示上面的字节模式(这是三字节模式0x05 0x39 0x77
)重复2048次。
但更好的方法是表示字节模式
0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48
单个位0
。然后我们可以通过0
重复上述字节模式重复2048次,这将成为重复256次的字节0x00
。现在我们只需要存储字典
0 -> 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48
并且字节模式0x00
重复256次,我们将文件从16,384字节压缩到(模数字典)256字节。
简而言之,压缩是如何工作的。整个业务归结为在给定文件中查找字节和字节序列的简短有效表示。这是一个简单的想法,但细节(找到表示)可能非常具有挑战性。
参见例如:
答案 2 :(得分:0)
压缩之间的概念基本上是统治性的。如果你有一系列字节,实际上字节N为X的几率取决于前一个字节0..N-1的值分布。如果没有压缩,则为每个可能的值X分配8位。通过压缩,为每个值X分配的字节数取决于估计的机会p(N,X)。
例如,给定序列“aaaa”,压缩算法可以将高值分配给p(5,a),将较低值分配给p(5,b)。当p(X)为高时,分配给X的位串将是短的,当p(X)为低时,使用长位串。这样,如果p(N,X)是一个很好的估计,那么平均位串将短于8位。