基于Huffman 和 LZ77的文件压缩(五)收尾

点我看LZ77代码

压缩好了,就知道文件怎么存了
解压缩就超级简单了。

获取标记文件,判断比特位0还是1
遇见0直接解压缩
遇见0向前匹配DIST距离,找LEN长度。

解决 大于64K文件的压缩

针对上一篇无法解决64K以上文件也很好解决。

在读取文件后解决时,每次只需判断一下缓冲区的剩余数据够不够MIN_MATCH

不够的话从文件中读取WSIZE个,

那么在读取之前,先讲先行缓冲区窗口内的数据搬移到查找缓冲区,

同时更新哈希表中的位置数据,和冲突数据

直到读取到文件尾。

压缩效率

在这里插入图片描述

遇到的问题

1 缓冲区错用了char ,char不能会出现下标为负数的情况,导致数组下标越界。

2 寻找最长匹配的时候错用了UCH导致部分解码失败UCH接收256~258时发生错误,长度应该用USH接收,因为我们匹配为3~258

3 写压缩文件和解压缩时文件指针类型刚开始写的时普通类型,后期发现导致汉字出现乱码,解决方式:让文件指针以二进制方式

4 解压缩时,未及时刷新缓冲区,错将fflush(文件指针)写成fflush(stdout)

PS 这个错误导致我找错找了1天多。。哭死了~ 这下长记性了吧?

对LZ77 的压缩结果再压缩,效率就不怎么好了。

能否采用Huff曼的方式直接对LZ77结果再压缩?

**可以 ,但压缩率可能不是很好;

1 Huffman缺陷 :需要创建哈夫曼树,可能会很大

2 LZ77的标记信息也会参与Huffman压缩,因此,影响压缩率。

3 树大的话,内存可能压力比较大。

假设文件中含有200个不同种类的字节,
那么 总节点将是叶子结点200 +临时父亲199个 = 399个节点。即2n -1。
那么Huffman树就很大了 ,获取编码的效率就比较低了。

获取编码的方式: 递归到叶子。

解决方案: 范式哈夫曼树

在这里插入图片描述
范式哈夫曼树: 在哈夫曼树的基础上,做了强制约定:
1 同一层节点中,所有的叶子节点都调整的左边

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值