文件压缩 1

文件压缩:ZIP
1.什么是文件压缩?

    数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,
或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。

2.为什么需要对文件进行压缩?

	a.文件太大,为了节省空间
	b.提高数据在网络上传输的效率
	c.压缩之后,对文件可以起到加密的作用。在文件传输的过程中更安全

3.文件压缩分类?

	a.有损压缩:解压缩之后不能将其还原成与源文件完全相同的格式。解压缩之后的文件虽然有损,但是在识别文件内容的时候,基本没有障碍。
		举例:看电影的时候,有表情,高清,蓝光。视频文件进行了分类,虽然视觉有体验差异,但是并没有影响对信息的获取
	b.无损压缩:源文件被压缩之后,通过解压工具如果能够还原成和源文件完全相同的形式

4.如何进行压缩?

GZIP压缩算法经历了两个阶段
	第一个阶段使用改进的LZ77压缩算法对上下文中的重复语句进行压缩
	第二阶段,采用huffman编码思想对第一阶段压缩完成的数据进行字节上的压缩,从而实现对数据的高效压缩存储。

	对于一些文件来说可以通过一定的算法,来达到压缩的目的。
	GZIP:GZIP就是L7ZZ的变形 + 基于哈夫曼编码的压缩
	L7ZZ变形:原理就是将重复出现的语句用距离长度对来替换
		举例:	对mnoabczxyuvwabc123456abczxydefgh进行压缩
				压缩结果:mnoabczxyuvw(9,3)132456(18,6)defgh
		括号中数字的意思就是在距离现在9个字符的位置,往后数有3个字符重复
	所以说现在的问题就是如何从一个长的文件中找到尽可能多的字符?假如使用的是STL中的字符匹配,
	时间复杂度太大,所以有别的查找算法。在第一步压缩结束的情况下,再进行基于哈夫曼编码的再次压缩

	L7ZZ:是基于语句的压缩。
	哈夫曼编码是基于字节的压缩。

了解:L7ZZ压缩算法简单介绍

GZIP中哈夫曼思想:

       通过前面LZ77变形思想对源数据进行语句的重复压缩之后,语句层面的重复性已经解决,但并不代表压缩效果已经
达到最佳,字节层面可能也有大量重复的。比如:"BCDCDDBDDCADCBDC"

       一个字节占8个比特位,那如果能对所有字节找到小于8个比特位的编码,然后用找到的编码对源文件中对应字节重
新进行改写,也可以让源文件更小。

1.静态等长编码
在这里插入图片描述
根据静态等长编码压缩方式将"BCDCDDBDDCADCBDC"压缩后为01101110 11110111 11100011 10011110,压缩完成后的结果只占4个字节
2.动态不等长编码:
在这里插入图片描述
使用不等长编码对源数据进行压缩:10111011 00101001 11000111 01011,最后还比登长压缩,多压缩了三个比特位,效果比等长压缩,更好一点。

获取哈夫曼编码:
在这里插入图片描述
现在问题就是,如何根据需要压缩的文件,获取哈夫曼编码树,再由哈夫曼编码树确定不等长编码?

huffman树构建

1. 由给定的n个权值{ w1, w2, w3,, wn}构造n棵只有根节点的二叉树森林F={T1, T2 , T3,,Tn},
每棵二叉树Ti只有一个带权值wi的根节点,左右孩子均为空。
2. 重复以下步骤,直到F中只剩下一棵树为止

	a.在F中选取两棵根节点权值最小的二叉树,作为左右子树构造一棵新的二叉树,新二叉树根节点的权值为其左右子树根节点的权值之和
	b.在F中删除这两棵二叉树
	c.把新的二叉树加入到F中

在这里插入图片描述
在这里插入图片描述

问题:如果不等长编码中出现一个编码是另一个编码的前缀怎么办?该情况是否会出现?

肯定不会,因为每个叶子节点都是唯一的,通往叶子结点的路径也是唯一的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值