亲自尝试压缩数据
问题
-
文件存储的基本单位是什么?
1字节
-
DOC、LZH和TXT这些扩展名中,哪一个是压缩文件的扩展名?
LZH是用LHA等工具压缩过的文件的扩展名
-
文件内容用“数据的值×循环次数”来表示的压缩方法是RLE算法还是哈夫曼算法?
RLE算法
-
在Windows计算机经常使用的SHIFT JIS字符编码中,1个半角英数是用几个字节的数据来表示的?
半角英文数字是用1字节来表示的,汉字等全角字符是用2字节来表示的
-
BITMAP格式的图像文件,是压缩过的吗?
BMP格式的图像文件是没有被压缩过的,因此要比JPEG格式等压缩过的图像文件大不少
-
可逆压缩和非可逆压缩的不同点是什么?
压缩后是否能复原。非可逆压缩的图像不会让人感到不自然。
文件以字节为单位保存
文件是将数据存储在磁盘等存储媒介中的一种形式。程序文件中存储数据的单位是字节。文件就是字节数据的集合。在任何情况下,文件中的字节数据都是连续存储的。
RLE算法的机制
把文件内容用“数据×重复次数”的形式来表示的压缩方法称为RLE算法(行程长度编码Run Length Encoding)。经常被用于压缩传真的图像等。它的缺点也很明显,不适合对文本文件进行压缩,因为文本文件中同样字符连续出现的部分并不多。
通过莫尔斯编码来看哈夫曼算法的基础
哈夫曼算法的关键就在于多次出现的数据用小于8位的字节数来表示,不常用的数据则可以用超过8位的字节数来表示。但不管是不满8位的数据,还是超过8位的数据,最终都要以8位为单位保存到文件中。为了实现这一处理,压缩程序的内容会复杂很多,不过作为回报,最终得到的压缩率也是相当高的。
莫尔斯编码把一般文本中出现频率高的字符用短编码来表示。这里所说的出现频率,不是通过对出版物等文章进行统计调查得来的,而是根据印刷行业的印刷活字数目而确定的。
用二叉树实现哈夫曼编码
哈夫曼算法是指,为各压缩对象文件分别构造最佳的编码体系,并以该编码体系为基础来进行压缩。用哈夫曼算法压缩过的文件中,存储着哈夫曼编码信息和压缩过的数据。编码体系可以按照“出现频率高的字符用尽量少的位数编码来表示”这一原则进行整理。不过,这个编码体系是存在问题的。该问题就是,如果不加入用来区分字符的符号,这个编码就无法使用。而在哈夫曼算法中,通过借助哈夫曼树构造编码体系,即使在不使用字符区分符号的情况下,也可以构建能够明确进行区分的编码体系(哈夫曼树下一些编码会向前补0方便区分)。
哈夫曼算法能够大幅提升压缩比率
从用哈夫曼算法压缩过的文件中读取数据后,就会以位为单位对该数据进行排查,并与哈夫曼树进行比较看是否到达了目标编码,这就是为什么哈夫曼算法可以对数据进行区分的原因。不管是哪种类型的文件,都得到了很高的压缩比率。
可逆压缩和非可逆压缩
图像文件的使用目的通常是把图像数据输出到显示器、打印机等设备上。Windows的标准图像数据形式为BMP,是完全未压缩的。由于显示器及打印机输出的点是可以直接映射的,因此便有了Bitmap这一名称。
图像文件还可以使用与前面介绍的RLE、哈夫曼算法不同的其他压缩算法。这是因为,多数情况下,并不要求压缩后的图像文件必须还原到与压缩前同等的质量。对于图像文件来说,即使有时无法还原到压缩前那样鲜明的图像状态,但只要肉眼看不出什么区别,有一些模糊也勉强可以接受。而文本文件不能进行非可逆压缩。
- JPEG:非可逆压缩,因此还原后图像信息有一部分是模糊的
- TIFF:带有各种标签信息,还可以选择压缩格式,无压缩时比原始的BMP文件还要大
- GIF:可逆压缩,但因为有色数不能超过256色的限制,还原后颜色信息会有一些缺失
压缩算法的种类大概有一二十种。之所以会存在如此多的压缩算法,是因为压缩比率、压缩需要的处理时间以及各种文件的需求等是不一样的。