基于huffman压缩算法实现文件压缩项目

以字符串“aaaabbbccd”为例实现文件压缩。
(1)统计各字符出现个数
a:4
b:3
c:2
d:1
(2)利用各字符出现的次数作为权值构建huffman树
哈夫曼树又称为最优二叉树,是加权路径长度最短的二叉树。
构建规则:每次在给定数据中挑选出两个权值最小的数,分别作为左右孩子节点,构建一个父节点将两个孩子节点链接起来,父节点权值等于左右孩子权值之和,然后再将父节点放回存放数据的序列;重复过程,直到所有数据存放数中。下图以1,2,3,4四个数字为例构建哈夫曼树。右边为得到的huffman编码。

(3)进行压缩
压缩之前文件中存放的是“aaaabbbccd“一共10个字节;进行编码后每个字符可以使用一段二进制序列表示对应的编码,同样上图的编码,写入文件信息就是”0000(4个a)101010(3个b)111111(2个c)110(1个d),占19个比特位,所以占用3个字节,原文件中10个字符都是char型,所以占用10个字节,以此达到huffman树文件压缩的效果。
huffman压缩算法压缩率高的情况就是出现特别多的重复字符(如上图中的”a”),只有少数是别的字符。效率低的情况就是每个字符出现的次数基本相同。

注意点:
1)向文件中写入信息时,按照二进制读写方式写入;每次向内存写入一个字节;最后若不满一个字节,单独进行判断补0.
2)建立配置文件:在解压缩时,如果没有配置文件,那么文件中只有0101序列,根本不知道写的是什么;所以需要增加配置文件,在压缩文件的开头先记录出现的每个字符以及对应出现的次数,方便解压缩时重建huffman树。

(4)解压缩
拿着压缩文件进行读取并重新写入文件。

注意点:
1)先读取配置文件重新构建huffman; 2)压缩过程中最后的填充位导致数据冗余。
3)解压缩的过程就是拿着我们之前压缩文件中的信息进行重新构建huffman树,按照对应的编码翻译出对应的字符即可。
4)由压缩文件还原文件的时候如何知道压了多少字符呢?当压缩的时候最后一位补了0的在解压缩的时候可能会把这个补的位当成原字符的编码来处理。如何解决呢?一种想法是在统计字符出现的次数的时候设置一个变量,每读取一个字符该变量的值就+1,最后将该变量写进配置文件中;另外一种想法就是根据根节点的权值,由上例不难看出根节点权值中的_count就是字符出现的次数。

由上述步骤程序基本可以压缩少量字符并正确的还原了,那么如果时大文件或者是汉字,图片以及音频文件呢?
1)读取字符时如果使用EOF进行判断,可能会导致写入的内容不全。使用feof函数代替:feof是一个c语言函数,既可用以判断二进制文件又可用以判断文本文件。
2),汉字,图片,视频在内存中是以二进制形式存储,二进制写入就需要采用二进制读写方式,在open文件时,采用”rb”,”wb”选项。
3)统计字符出现次数应该用的类型是long long,解决大文件压缩和解压缩问题。
总结:
(1)当待压缩文件中出现来了中文,程序就会崩溃,最后发现是数组越界的错误,程序中使用char类型为数组下标(0~127),如果只是字符它的范围是-128~127,而汉字的编码是两个字节,因此需要将char类型强转为unsigned char,可表示范围为0~255
(2)特殊情况处理:当遇到\n,程序函数就是读取一行字符,但若字符本身末尾就含有’\n‘,需要特殊处理。读取配置文件时如果读到了’\n’,说明字符本身就是’\n’,应继续读取它的次数。
代码存放:[https://github.com/zjx150714/zipfile]

文件压缩项目测试步骤分析
(1)了解项目需求
背景:磁盘空间不够,需要一个压缩,解压缩文件
(2)需求分析
文件类型(图片,文档,视频)
压缩文件个数
压缩大小
安全需求
界面需求
(3)制定测试方案
测试工具:禅道
测试涉及类型:功能,性能,安全,兼容,界面,易用性
测试执行流程:需求测试;提测版本测试;回归测试。
(4)编写测试用例
压缩单文件,压缩多个不同类型文件,压缩100个文件,压缩0个文件,压缩文件大小超过5G文件,压缩文件大小刚好5G文件,压缩单个被压缩的文件
(5)冒烟测试
压缩,解压缩功能正常
(6)测试执行
(7)输出测试报告
(8)版本发布
(9)项目总结
测试用例情况分析:

总体思路:
(1)统计:读取一个字符,统计出256个字符中各个字符出现的总次数。
(2)建树:按照字符出现的次数,并以次数作为权值建立哈夫曼树,然后产生各个字符的哈夫曼编码。
(3)压缩:再次读取文件,按照该字符对应的编码写到新的编码文件中。
(4)加工:将文件的长度,文件中各个字符以及他们出现的次数,写进编码文件中。
(5)解压:利用压缩文件和配置文件恢复出原文件。
(6)测试:带入测试用例,观察解压出的文件和原文件是否相同。

文件压缩(哈夫曼树)相关推荐

  1. 哈夫曼树实现文件压缩

    最近在学了哈夫曼树之后,作为练习,写了一个文件压缩的小项目: 在这里和大家分享一下: 主要实现思路: 利用哈夫曼树的特性对字符进行哈夫曼编码,其中运用到了最小堆:利用最小堆的特性,找出构造哈夫曼树的结 ...

  2. 创建霍夫曼树,霍夫曼编码以及使用霍夫曼编码压缩文件

    那么,什么是霍夫曼树(赫夫曼树)呢? 给定n个权值(权值就是每个节点里面存放的数据,但是根据业务需求不同,存放的数据类型有些差别)作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样 ...

  3. labview 霍夫曼树_哈夫曼树编码实验报告_信息论与编码实验2 实验报告_信息论与编码报告...

    huffman编码C语言实验报告 今日推荐 180份文档 2014...4页 1下载券 安卓版100 doors 2攻略1... 3页 1下载券 <逃脱本色>doors....语文教育实习 ...

  4. 哈夫曼树实现压缩文件

    哈夫曼树实现文件的压缩 #include <stdio.h> #include <stdlib.h> #include <string.h>//以字节形式读入目标文 ...

  5. 用赫夫曼树进行文件的压缩

    思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStat ...

  6. 哈夫曼树实现文件的压缩与解压缩

    利用哈夫曼树实现文件的压缩与解压缩 压缩: 1.统计出文件中相同字符出现的次数 2.获取哈夫曼编码 次数作为权值构建哈夫曼树 3.重新编码,写回压缩文件 保存头文件: 源文件后缀 编码信息的行数 每个 ...

  7. 利用哈夫曼树实现对文件的压缩和解压缩的示例代码

    哈夫曼树是带权路径最短的树,权值加大的节点离根节点较近. 示例代码如下: public class HuffmanTreeCode {public static void main(String[] ...

  8. 用赫夫曼树进行文件解压

    思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStat ...

  9. 对文件进行哈夫曼编码压缩与译码的C++实现 以及压缩率计算 ——HIT杨朔

    哈夫曼编码压缩原理:由于每个字符在内存中都是以ASCII码进行存储,所以每个字符都占用了八个01位,利用哈夫曼树对每个字符进行01编码,根据字符在文章中出现的频率调整01串长度,出现频率高的字符在哈夫 ...

  10. 数据结构编程实践(七)创建哈夫曼树、生成哈夫曼编码、完成图片的压缩与解压缩

    一.对图片的压缩与解压缩,涉及以下内容: 1.文件读写 2.创建Huffman树 3.生成Huffman编码 4.压缩图片文件 5 .  解压缩图片文件 二.将项目分成三个小任务,下一任务是在上一任务 ...

最新文章

  1. Wireshark EndPoints窗口
  2. linux实验串行端口程序设计,Linux下串口编程心得(转)
  3. apache cxf_Wildfly,Apache CXF和@SchemaValidation
  4. 组合问题 已知组合数_组合和问题
  5. OceanBase如何获得TPC-C测试第1名?
  6. 一条看似不合理SQL和10个合理的解释
  7. 设置自定义ASP.NET服务器控件TagPrefix的几种方法
  8. 收下这份说明书,原来迈进智能计算的大门如此简单
  9. JAVA:DOM解析XML和修改XML
  10. Observer(观察者)模式
  11. Java和C#的区别
  12. Luence简单实现2
  13. 2021-4月最全停词表(1893个),速取
  14. python--下载文件并将文件放到指定文件夹
  15. 两直线夹角求解-Python编程实现
  16. 金蝶系统安装后怎么连服务器,金蝶安装在云服务器上怎么连接
  17. UltraEdit下Shift键失效
  18. 解决旅行商问题的方法
  19. android传屏器怎么获取热点,手机做热点怎么投屏 为你介绍投屏的方法
  20. python调整视频内容比例_moviepy音视频剪辑:与大小相关的视频变换函数crop、even_size、margin、resize介绍...

热门文章

  1. 为什么FFFF FFFF是4GB
  2. c语言中case的作用,c语言中case的用法
  3. python extract_convert.py对应代码解读抽取式提取+生成式提取摘要代码解读------摘要代码解读1
  4. 一个小想法--理解指针的机制与汇编中的寄存器间接寻址
  5. 【图文并茂】正版Win10 U盘重装系统教程
  6. 【error】error: failed to push some refs to ‘远程仓库地址‘ git报错解决
  7. 英语应征计算机作文,高三英语作文 应征英语话剧社的邮件English Drama Club
  8. IDEA 导入 czml-writer
  9. NPOI导出数据到Excel
  10. EasyExcel筛选和冻结首行