程序是怎样跑起来的-第06章 亲自尝试压缩数据

第06 亲自尝试压缩数据

热身问题

1:文件存储的基本单位是什么?

    1字节(8),文件是字节数据的集合体。


2:文件内容用数据的值*循环次数来表示的压缩方法是RLE算法还是哈夫曼算法?

    RLE算法,例如:AAABB这个数据压缩后是A3B2。像这样,把文件内容用数据*重复次数的形式来表示的压缩方法称为RLERun Length Encoding,行程长度编码)算法,如发送传真图像时多使用此算法。


3:BMPBITMAP)格式的图像文件,是压缩过的吗?

     没有压缩过,因为BMP格式的图像文件是没有压缩的,因此要比JPEG格式等压缩过的图像文件大不少。


4:可逆压缩和非¥[可逆压缩]的不同点是什么?

        压缩后的数据¥[能复原]的是可逆压缩,¥[无法复原]的是非可逆压缩。像JPEG格式这样的图片,之所以压缩后会让人感到不自然,就是因为使用了非可逆压缩。

6.1 文件以字节为单位保存

    文件是将数据存储在磁盘等存储媒介中的一种形式。程序文件中存储数据的单位是字节。文件的大小之所以用XXKBXXMB等来表示,就是因为文件是以字节(BByte)为单位来存储的。

    文件是将数据存储在磁盘等存储媒介中的一种形式,程序文件中存储数据的单位是¥[字节]。从物理上对磁盘进行读写时是以¥[扇区的整数倍(簇)](如512字节)为单位的,但另一方面,程序则可以在¥[逻辑]上以字节为单位对文件的内容进行读写。文件就是¥[字节数据的集合],在任何情况下,文件中的¥[字节数据]都是¥[连续存储]的,大家一定要认识到这一点。


6.4 用二叉树实现哈夫曼编码

    压缩后同压缩前文件大小的比率,称为¥[压缩比率]¥[压缩比]

    哈夫曼算法(D.A.¥[Huffman]):举例说明:如一文本文件中每个字符占1个字节、8个位,若文本中有100个字符‘Q’2个字符‘A’,则共占据102个字节,816位。若使用2个位表示‘Q’10个位表示‘A’则使用200位+20位即可。可以看出选择恰当的¥[编码体系]可以有效的减少占用的存储空间。

    哈夫曼算法是指,为各压缩对象文件分别构造最佳的编码体系,并以该编码体系为基础来进行压缩。因此,用什么样的编码(¥[哈夫曼编码])对数据进行分割,就要由各个文件而定。用哈夫曼算法压缩过的文件中,存储着哈夫曼编码信息和压缩过的数据。

    下面我们一AAAAAAEEEEEBBDDCF为例来说明哈夫曼编码:

        字符:A      E      B      D      C       F

        频率:6       5      2       2      1       1

        编码:0      1      10     11     100   101   

        位数:1      1       2       2      3       3

    可以看出频率越高的字符所占用的存储空间¥[越少],但是该体系存在问题:例如100这个3位的编码,意思是什么呢?因此如果不加入区分字符的符号,这个编码方案就无法使用。我们可以通过哈夫曼树构造编码体系,在不使用字符区分符的情况下也可以明确区分编码体系。

    哈夫曼树:在哈夫曼算法中,通过借助¥[哈夫曼树]构造编码体系,即使在不使用字符¥[区分符]号的情况下,也可以构建能够明确进行区分的编码体系。以AAAAAABBCDDEEEEEF为例:

    步骤1:列出数据及其出现频率,()里面表示的是出现频率,这里按照降序排列

        频率:6    5     2    2      1    1

        字幕:A    E    B    D     C    F

    步骤2:选择两个出现频率最小的数字,拉出两条线,并在交叉地方写上两个字的和。当有多个选项时,任意选取即可。

                                                2

                                               /  \

        频率:6    5     2    2      1    1

        字幕:A    E    B    D     C    F

    步骤3:重复步骤2,知道这些数字汇聚到一个点上。

                                  17

                              /          \

                           /              6

                        /                  \

                     11            4         2

                    /   \         /   \        /   \

        频率:6    5     2    2      1    1

        字幕:A    E    B    D     C    F

    步骤4:最后这些数字汇聚到一个点上,该点就是根,这样哈夫曼树也就完成了。按照从根部到底部的叶子这一顺序,在左边的树枝上写上0,右边的树枝上写上1。然后从根部开始沿着树枝到达目标文字后,再按照顺序把树枝上的0或者1记录下来就是哈夫曼编码了。

        频率:6      5       2        2       1      1

        字幕:A      E      B        D      C      F

        编码:00    01    100    101   110   111

    认真观察可以发现,在用树枝连接数据时,我们是从出现¥[频率较低]的数据开始的,这就意味着出现频率较低的数据到达根部的枝条就越多。而枝条数越多,编码的位数也就随之增多。仔细观察还会发现两位的编码与任一个三位的编码的前两位¥[绝不相同],否者在解码时就有可能出现¥[歧义]

6.7 非可逆压缩和可逆压缩

    可逆压缩和非可逆压缩:Windows的标准图像数据形式为BMP,是完全未压缩的。由于与显示器以及打印机输出的bit(点)是可以直接¥[映射]mapping)的,因此便有了BMPbitmap)这一名称。常用的图片格式还有:BMP(Bitmap)JPEG(Joint(joint |dʒɔɪnt| n 关节、接合处 adj联合的) Photographic(|ˌfəʊtəˈgræfɪk| adj 摄影的) Experts(expert |ˈekspɜːt| n 专家 adj 熟练的) Group)TIFF(Tag Image File Format)GIF(Graphics Interchange(interchange n 交换 v 交替发生) Format)等。

    对于图像来说通常使用¥[非可逆压缩]。因为对于图像来说,即使有时无法还原到压缩前那样鲜明的图像状态,只要肉眼看不出也没关系。例如JPEG格式使用的就是非可逆压缩。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值