所以,我今天才意识到,我把文件压缩视为理所当然。将几个文件打包成一个文件,然后压缩后的文件比其中任何一个文件都小,这是我接受的事实,但它究竟是如何工作的呢?
我对此的了解有限,包括用指针替换所有重复的条目,以此方式缩小,但除此之外,我相当无知!
我总是乐于接受新知识,我想我们大多数人都是这样,所以我想问一下。那么,超级用户,压缩是如何实现的实际上工作?
答案1
无损压缩
无损压缩是指不会丢失任何数据。输入的所有内容都可以完美恢复。这非常适合文本或二进制文件,因为即使是最小的错误也会被注意到。
文件压缩的工作原理是获取文件并扫描模式,然后将这些模式转换成占用更少空间的其他内容。
例如“AAAAAAAA”可以变成“8A”。
当然,事实并非如此,因为这样你就会有问题,如果“8A”是明文的话会怎样。你会解压文件,但结果却是错误的。一个好的起点是维基百科或LZW数据压缩算法。
下面复制了一些简单的伪代码:
STRING = get input character
WHILE there are still input characters DO
CHARACTER = get input character
IF STRING+CHARACTER is in the string table then
STRING = STRING+character
ELSE
output the code for STRING
add STRING+CHARACTER to the string table
STRING = CHARACTER
END of IF
END of WHILE
output the code for STRING
所有压缩都使用查找字典来压缩和解压缩文件。字典越大,压缩率越高,尽管你确实会遇到收益递减规律。
还值得注意的是,压缩并不一定总能使文件变小。有些情况下(文件较小,或者压缩随机数据时)你将不是压缩后文件变小。有一些有趣的挑战与压缩随机数据的能力有关。
“有损”压缩
以上主要涉及无损压缩. 视频/音频应用程序中使用的其他类型的压缩,如 MP3、JPG 和 h.264 就是例子有损压缩。
有损压缩的工作原理是丢弃最不可能被注意到的数据。在音频中,这是大约 30,000 赫兹和 100 赫兹以下的声音,以及其他各种东西。在图片(静态)中,它会删除各种东西并将像素合并在一起,同时丢弃数据。
有损压缩是一种变换编码。它会对数据进行平均以减小整体大小。例如,图像中 10 个像素的块,所有略有不同的颜色可能会合并为一种颜色,从而进行压缩。
在视频压缩中,通常会放置指令以仅重绘自上一帧以来发生变化的像素,或者关键帧。
答案2
压缩的工作原理是查找数据中的模式,然后用特殊的较小模式替换这些模式。解压缩是相反的:查找特殊模式,并用它们所代表的较大模式替换它们。了解哪些模式是可能的很重要;例如,在文本中找到的模式可能与在图像中找到的模式完全不同。一些压缩技术是有损的;它们不能保证扩展将完全恢复输入。如果损失足够小,这通常适用于模拟数据,例如音乐和图像。但文本等数据必须使用无损技术进行压缩。
重要的是要意识到,即使只压缩一位,也不可能无损地压缩随机数据。考虑一个包含 N 位二进制数据的文件。可能的文件有 2^N 个。如果用一位压缩这些文件中的任何一个,那么压缩文件的大小为 N-1 位,则只有 2^(N-1) 种可能的压缩表示。换句话说,每个可能的压缩文件必须代表多个可能的未压缩文件。如果没有唯一的压缩表示,解压缩算法就无法保证无损解压缩。