计算机|压缩数据

相信很多看过JOJO的朋友都对一句话相当熟悉。(打死)

嗯,今天聊聊压缩方式。

0

文件以字节为单位保存

在说压缩机制前,先了解一下保存在文件中的字节形式。文件大小之所以用KB、MB表示,就是因为文件以字节为单位保存。

1

RLE算法

RLE算法就是用“字符×重复次数”的方式压缩,比如压缩字符串AAAAAABBCDDEEEEEF就存成A6B2C1D2E5F1。我们再看原字符长17字节,而压缩后是12字节,12÷17≈70%,这样就压缩成功了。

RLE算法应该说是最简单的压缩算法了,符合考虑压缩算法时的第一反应——合并重复项。但是这种算法实际应用却不多,原因很简单,字符多次重复出现的情况并不多见,而且,对一个7位字符串ABCDEFG,会存成A1B1C1D1E1F1G1H1一共14个字节,压缩率反而成为100%。

这里提RLE算法的原因是其逻辑简单,容易想到,有一定参考价值并且真的太太太容易编写了。

2

摩尔斯编码

在讲下一个算法时,先讲讲摩斯电报。摩斯电报通过长短点传递文本信息。在各种战争片中,摩斯电报出现频率非常高。

如果我们将摩斯电报的思想运用到编码上,就是摩斯编码。而计算机是二进制存储数据的,那么就用0类比短点,1类比长点?如果是这样,那么问题来了,如何划分不同字符?

实际上,计算机里摩尔斯编码常用1类比短点,11类比长点,0分开长短点,00分开每个字符

这样,每个字符就有相应的摩尔斯编码。当然,这种编码是可以变化的,根据实际情况赋予不同字符不同长度的编码,只要接收方有对应的表和方法就可以重现原来的内容。

3

哈夫曼算法

接下来就是经典常用的哈夫曼算法。


举个例子,一个文件内,有100个A,4个E,这时要压缩的话,把A赋予较小的摩尔斯编码,如1,而E可以给较长的编码以便较短的编码分配给其余较多的字符,如E对应110101101一共9位,这样,加上字符间隔,一共是1×100+9×4+2×104=344位,344位(如果不够8的整数倍,加上结束符然后补足8的倍数即可)。原文件是8×104=832位,344÷832≈41%,显然达到了很好的压缩效率。

因此,归纳一下,哈夫曼算法是为各压缩对象文件分别构造最佳的编码体系,并以该编码体系为基础来进行压缩的算法。

4

为啥表情包越来越糊

最后,来看看图片的压缩方式。最完整的图片是BMP格式,这种格式的图片完全没有被压缩,而JPEG、TIFF、GIF等格式都会用一些技法对图片进行压缩。压缩方式分两种,可逆压缩和非可逆压缩,可逆压缩能还原到压缩前状态,非可逆压缩则不行。

JPG是非可逆压缩,所以还原后的图片有部分是模糊的,而相当一部分的表情包经过网络的反复传播,经历了多次压缩解压缩的蹂躏后终于变成了那种很有味道的高糊图片。因此,每一张模糊的表情包图片都是表情包界的荣耀。

GIF是可逆压缩,但是还原后颜色信息会有一些丢失,导致图像模糊。


发布了16 篇原创文章 · 获赞 2 · 访问量 1729

猜你喜欢

转载自blog.csdn.net/chengduxiu/article/details/104400670