文件的压缩与解压huffman算法功能实现.docx
- 文档编号:11496340
- 上传时间:2023-03-02
- 格式:DOCX
- 页数:29
- 大小:89.41KB
文件的压缩与解压huffman算法功能实现.docx
《文件的压缩与解压huffman算法功能实现.docx》由会员分享,可在线阅读,更多相关《文件的压缩与解压huffman算法功能实现.docx(29页珍藏版)》请在冰豆网上搜索。
文件的压缩与解压huffman算法功能实现
文件的压缩与解压
──huffman算法功能实现
摘要:
压缩的实质是数字变换,在多媒体信息中包含大量冗余的信息,把这些余冗的信息去掉,就是实现了压缩;解压是由于计算机处理的信息是以二进制数的形式表示的,因此压缩软件就是把二进制信息中相同的字符串以特殊字符标记来达到压缩的目的。
关键词:
压缩;解压缩;需求分析;概要设计;详细设计;测试
Abstract:
Compressionistheessenceofdigitaltransformation,containsalargeamountofredundantinformationinthemultimediainformation,theresidualredundancyinformation,istoimplementthecompression;Decompressionisduetothecomputerprocessingofinformationintheformofabinarynumber,sothecompressionsoftwareisbinaryinformationinthesamestringtagasspecialcharacterstoachievethepurposeofcompression.
Keywords:
Compression;Thedecompression;Demandanalysis;Theprofiledesign;Thedetaileddesign;Test;
1需求分析
解决整个项目系统的“做什么”的问题。
在这里,对于开发技术并没有涉及,而主要是通过建立模型的方式来描述用户的需求,为客户、用户、开发方等不同参与方提供一个交流的渠道。
随着科学技术的进步,信息技术越来越广泛地应用到社会的各个行业和领域,互联网深刻地改变着人们的生活方式,推动着人类文明的进步。
伴随着信息技术的普及和发展,互联网技术覆盖了社会政治、经济、文化、生产的各个领域,这种普及使日常生活和工作更加的方便、文娱乐方式更加的多样化。
但是,在信息技术的飞速发展,文件的信息量不断增加的背景下,如何让有限的磁盘空间容纳更多数据,成为需要解决的问题。
高速发展的存储技术以提高磁盘容量来解决这样的需要,但随着网络环境下数据传递的产生以及宽带的限制,大容量数据问题日益突出。
在需求的推动下,对数据压缩的需求产生了。
要求文件的存储和拷贝能够保持数据的意思不变的情况下缩小容量,并在使用者需要的时候将文件恢复成原有的样子,这就是压缩与解压的目的。
1.1项目要达到的目标
本项目设定的目标如下:
(1)系统能够提供友好的用户界面,使操作人员的工作量最大限度的减少
(2)系统具有良好的运行效率,能够得到提高生产率的目的
(3)系统应有良好的可扩充性,可以容易的加入其它系统的应用。
(4)平台的设计具有一定的超前性,灵活性
(5)通过这个项目可以锻炼队伍,提高团队的开发能力和项目管理能力
1.2系统整体结构
1.3环境
1.3.1系统开发环境
使用了Eclipse进行程序开发,Eclipse是一个可视化JAVA开发工具。
是在JAVA2平台上开发商业引用程序、数据库、发布程序的优秀工具。
它支持J2EE,所以程序员可以快速的转换企业版JAVA应用程序。
使用此开发工具可以实现程序的可视化。
系统平台
开发语言:
JAVA
开发工具:
myEclipse
开发环境运行平台:
WindowsXP(SP3)或者Windows7
硬件配置
CPU:
corei3
内存:
2G
硬盘:
500G
分辨率:
最佳效果1024×768
1.3.2系统运行环境
在安装了JAVA虚拟机的操作平台下即可使用。
我用的是在WINDOWS7上安装的JAVA虚拟机
操作系统:
Windows7
硬件配置
CPU:
corei3
内存:
2G
硬盘:
500G
分辨率:
最佳效果1024×768
用的是jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008。
环境变量为:
JAVA_HOME=C:
\ProgramFiles\Java\jdk1.6.0_26。
Path=“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”
CLASSPATH=“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”
1.4功能
文件的压缩与解压,要能方便的进行,要完成的功能有:
(1).压缩功能
(2).解压缩功能
(3).选择文件路径
(4).选择操作方案
(5).选择新文件保存路径
(6).压缩成功后显示被压缩文件的大小
(7).错误操作,给出提示
1.5性能需求
根据用户对本系统的要求,确定系统在响应时间、可靠性、安全等方面有较高的性能要求。
(1)数据精确度
压缩时压缩准确
(2)时间特性
一般操作的响应时间应在3秒以内。
(3)适用性
适用性强,能满足一般用户的要求。
(4)正确性
要求发布的软件达到用户的预期目标,运行时基本无错误。
(5)可靠性
在一般的情况下,不会出错。
(6)运行效率
具有较高的效率,几乎不需要用户的等待。
(7)易使用性
要求能尽量为用户的使用提供方便。
(8)可维护性
要求本软件在运行中发现错误时,能快速、准确对其进行定位、诊断和修改。
(9)可测试性
设计时尽可能减少测试本软件的各项功能所需的工作量。
1.5.1界面需求
系统的界面要求如下:
主题突出,站点定义、术语和行文格式统一、规范、明确,栏目、菜单设置和布局合理,传递的信息准确、及时。
内容丰富,文字准确,语句通顺;专用术语规范,行文格式统一规范。
1.5.2响应时间需求
用户单击后,软件响应速度低于0.5s。
单个文件压缩速度不低于3mb/s
1.5.3开放性需求
系统应具有十分的灵活性,以适应将来功能扩展的需求。
1.5.4可扩展性需求
系统设计要求能够体现扩展性要求,以适应将来功能扩展的需求。
2压缩与解压程序设计
2.1概要设计
Huffman算法简介
DavidAlbertHuffman(哈夫曼/赫夫曼/霍夫曼)在MIT攻读博士学位期间于1952年提出了一种从下到上的编码方法,现在被称为Huffman编码,它是一种统计最优的变码长符号编码,让最频繁出现的符号具有最短的编码。
Huffman编码的过程具体编码步骤为:
(1)将符号按概率从小到大顺序从左至右排列叶节点;
(2)连接两个概率最小的顶层节点来组成一个父节点,并在到左右子节点的两条连线上分别标记0和1;
(3)重复步骤2,直到得到根节点,形成一棵二叉树;
(4)从根节点开始到相应于每个符号的叶节点的0/1串,就是该符号的二进制编码。
由于符号按概率大小的排列既可以从左至右、又可以从右至左,而且左右分枝哪个标记为0哪个标记为1是无关紧要的,所以最后的编码结果可能不唯一,但这仅仅是分配的代码不同,而代码的平均长度是相同的。
编码式压缩利用各个单字节使用频率不一样的倾向,使定长编码变为不定长编码,给使用频率高的字节更短的编码,使用频率低的字节更长的编码,起到压缩的效果。
由于Huffman编码为根结点到叶子结点路径上的0和1的序列,而一个叶子结点的路径不可能是另一个叶子结点路径的前缀,因此一个Huffman编码不可能为另一个Huffman编码的前缀,这就保证了Huffman编码是可以区分的。
由于用Huffman算法建立起来的树总是一棵最优二叉树,因此这又让Huffman编码能够实际应用到压缩中。
哈夫曼树又称最优二叉树,
是一种带权路径长度最短的二叉树。
所谓树的带权路径长度,就是树中所有的叶结点
的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度
为叶结点的层数)。
树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln)
,N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径
长度为Li(i=1,2,...n)。
可以证明哈夫曼树的WPL是最小的。
哈夫曼编码步骤:
1、对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。
)
二、在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
三、从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
四、重复二和三两步,直到集合F中只有一棵二叉树为止。
利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
这要求在发送端通过一个编码系统对待传输数据
预先编码,在接收端将传来的数据进行译码(复原)。
对于双工
信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
哈夫曼树节点:
publicclassNode
privateTdata;//当前节点
privatedoubleweight;//节点权重privateStringcoding="";//此节点的哈夫曼编码privateNode
privateNode
"+this.data+";weight:
"+this.weight+";Coding:
"+this.coding;}@OverridepublicintcompareTo(Node
Node
//构造根节点Node
//构造节点树parent.setLeft(left);parent.setRight(right);
//从原节点集合中删除最小的两个节点
nodes.remove(left);nodes.remove(right);
//将生成的新节点加入到节点集合,迭代操作nodes.add(parent);}
//返回哈夫曼树根节点
returnnodes.get(0);}//递归生成Huffman编码publicstatic
=null)root.getLeft().setCoding(root.getCoding()+"0");if(root.getRight()!
=null)root.getRight().setCoding(root.getCoding()+"1");generateHuffmanCode(root.getLeft());generateHuffmanCode(root.getRight());}publicstatic
=null){queue.offer(root);//向队列插入根节点}while(!
queue.isEmpty()){
list.add(queue.peek());//向list添加根节点Nodenode=queue.poll();//将队列的头部元素移除if(node.getLeft()!
=null){//如果含有左子树,将左子树添加到队列queue.offer(node.getLeft());}if(node.getRight()!
=null){//如果含有右子树,将右子树添加到队列queue.offer(node.getRight());}}returnlist;}}//测试importjava.util.ArrayList;importjava.util.List;publicclassTest{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubList
list2)System.out.println(node)}}
2.1.1压缩模块
2.1.2解压模块
2.1.3总体流程图(图2-1)
图2-1总体流程图
2.1.4Huffman算法实现压缩与解压(图2-2)
哈夫曼树结点的存储结构包括双亲域parent,左子树lchild,右子树rchil,还有字word,权重weight,编码code 对用户输入的信息进行统计,将每个字符作为哈夫曼树的叶子结点。
统计每个字符出现的次数作为叶子的权重,统计次数可以根据每个字符不同的ASCII
码,根据叶子结点的权重建立一个哈夫曼树。
建立每个叶子的编码从根结点开始,规定通往左子树路径记为0,通往右子树路径记为1。
由于编码要求从根结点开始,所以需要前序遍历哈夫曼树,故编码过程是以前序遍历二叉树为基础的。
同时注意递归函数中能否直接对结点的编码域进行操作。
编码信息只要遍历字符串中每个字符,从哈夫曼树中找到相应的叶子结点,取得相应的编码。
最后再将所有找到的编码连接起来即可。
译码则是将编码串从左到右逐位判别,直到确定一个字符。
这就是哈夫曼树的逆过程。
(1)
(2)
图2-2Huffman算法实现压缩与解压
2.1.5程序中各个类的初步定义
程序中各个类的初步定义:
为了完成此程序,主要设计和运用以下接口和类。
其中有
接口:
Compressor
类:
HuffmanCompressor;HuffmanTree;HuffmanNode;HuffmanTree;NBitInputStream;NBitOutputStream;ByteArray;Dict;LimitedDict;。
异常处理:
IOException。
各个类的简单介绍如表1:
表1:
程序各个主要类的作用
条目
类型
描述
Compressor
接口
被类HuffmanCompressor等实现的接口
HuffmanCompressor
类
使用Huffman算法来压缩文件类
HuffmanTree
类
使用Huffman算法来压缩文件的树存储结构
HuffmanNode
类
使用Huffman算法来压缩文件的树节点存储结构
BitInputStream
类
一个输入流,保存读取数据(要压缩文件数据)
BitOutputStream
类
一个输出流,保存成普通文件数据
IOException
异常类
抛出一个输入输出流异常
NBitInputStream
类
一个输入流,保存读取数据(压缩文件数据)
NBitOutputStream
类
一个输出流,保存压缩文件数据
2.2详细设计和实现
2.2.1压缩的程序流程(图2-3)
压缩程序的实现过程中,涉及到很多类的调用,除了压缩有关的类,还有IO类的调用。
忽略IO类,压缩类的调用过程如下:
(1)判断文件路径是否正确,正确后,选择压缩方法进行压缩。
(2)选择Huffman方法进行压缩。
(3)HuffmanCompress实现接口compress
(4)调用输入流将文件字符遍历存储个字节出现的频率
(5)通过统计数据,为建一个huffman树,调用HuffmanNode统计节点
(6)建立huffman树构建hash表字典,左支填0,右支填1
(7)通过这个哈夫曼树得到映射表
(8)新建一个输入流,为了重新开始读取
(9)写入每个字节的映射值
(10)用huffman算法压缩的文件,加个.huf的后缀名
(11)压缩完成
图2-3压缩流程图
2.2.2解压的程序流程
(1)解压程序的实现过程中,涉及到很多类的调用,除了压缩有关的类,还有IO类的调用。
忽略IO类,解压类的调用过程如下:
(2)获取路径中文件的后缀名,是huf,是用Huffman算法压缩的压缩文件
(3)用huffman算法解压,创建一个Huffman压缩器
(4)用压缩器的decompress方法解压
(5)bytesCount保存统计数据,每个字节出现了多少次
(6)通过统计数据遍历huffman树
(7)每次得一位,就调用getByte方法,看能不能返回一个对应字节
(8)对应字节不为空就输出
(9)解压完成
图2-4解压流程图
3压缩与解压的核心代码
3.1压缩
publicvoidcompress(StringinfileName,StringoutfileName)
throwsIOException{
InputStreaminp=newBufferedInputStream(newFileInputStream(infileName));
NBitOutputStreamnBos=newNBitOutputStream(newBufferedOutputStream(newFileOutputStream(outfileName)));
long[]bytesCount=newlong[256];
intnext;
while((next=inp.read())!
=-1)
{
bytesCount[next]+=1;
}
nBos.write(bytesCount,64);
inp.close();
try{
HuffmanTreeht=HuffmanTree.huffmanTreeBuild(bytesCount);Map
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 压缩 解压 huffman 算法 功能 实现