您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 实验2-Huffman编码对英文文本的压缩和解压缩
《信息论与编码》实验报告班级:学号:姓名:完成时间:2011年6月2日实验2Huffman编码对英文文本的压缩和解压缩一、实验内容根据信源压缩编码——Huffman编码的原理,制作对英文文本进行压缩和解压缩的软件。要求软件有简单的用户界面,软件能够对运行的状态生成报告,分别是:字符频率统计报告、编码报告、压缩程度信息报告、码表存储空间报告。二、实验环境1.计算机2.Windows2000或以上3.MicrosoftOffice2000或以上4.VC++6.05.MSDN6.0三、实验目的1.掌握Huffman编码的原理2.掌握VC开发环境的使用(尤其是程序调试技巧)3.掌握C语言编程(尤其是位运算和文件的操作)4.掌握数据结构的内容:链表、顺序表、堆栈、最优二叉树5.掌握结构化程序分析和开发的软件工程原理四、实验要求1.提前预习实验,认真阅读实验原理。2.认真高效的完成实验,实验过程中服从实验室管理人员以及实验指导老师的管理。3.认真填写实验报告。要求有实验问题、实验原理、Matlab的源程序以及实验结果(实验内容中)。4.每个同学必须独立完成实验(不能抄袭,否则两人均为零分),实验成绩是该门课程成绩的主要依据。五、实验原理1.压缩/解压缩流程压缩流程:读取扫描文本文件——〉统计字符频率——〉生成码字——〉保存压缩文件解压缩流程:读取扫描压缩文件——〉提取字符频率——〉生成码树——〉保存文本文件2.Huffman编码算法(略)3.文件操作和位运算(略)六、Huffman算法的8种不同实现方式1.huffman_a使用链表结构生成Huffman树的算法,这是最基本的实现方法,效率最低。2.huffman_b使用《数据结构》(严蔚敏,吴伟民,1997,C语言版)中给出的算法,将二叉树存放在连续空间里(静态链表),空间的每个结点内仍有左子树、右子树、双亲等指针。3.huffman_c使用CanonicalHuffman编码,同时对huffman_b的存储结构进行改造,将二叉树存放在连续空间tree里,空间的每个结点类型都和结点权值的数据类型相同,空间大小为2*num,tree[0]未用,tree[1..num]是每个元素的权值,生成Huffman后,tree[1..2*num-1]中是双亲结点索引。4.huffman_d在huffman_c的基础上,增加预先排序的功能先用QuickSort算法对所有元素的权值从小到大排序,这样,排序后最前面的两个元素就是最小的一对元素了。我们可以直接将它们挑出来,组合成一个子树。然后再子树的权值用折半插入法插到已排序的元素表中,保证所有结点有序。为了保证初始元素的顺序不变,我们另外使用了一个索引数组,所有排序中的交换操作都是在索引数组中进行的。5.huffman_e在huffman_d的基础上,将索引数组放在tree的内部。为编码方便,将元素权值放在tree[num..2*num-1]处。将tree[0..num-1]作为索引数组。排序改为从大到小。对索引数组排序后,每次从最后选出2个最小值,相加后的结点权值放在索引数组最后,结点索引放在索引数组中倒数第2个位置,然后索引数组大小减1,并将最后一个索引值插入到前面的有序表中,保证索引数组仍然有序。6.huffman_f在huffman_e的基础上,将排序改为利用堆排序原理选择最小的两个权值。也即,将所有元素的权值组织成堆后,每次堆内的根结点就是最小值了。每取出一个根结点后,就把堆尾元素调到根结点重建堆。取出两个最小值合并成一个子树后,再把子树作为叶子结点放到堆中,并让其上升到合适的位置,保持堆性质不变。因为每次不必完成整个排序过程,而只是组织成堆,因此,这种方法要比使用快速排序更快。上述算法参考了mg-1.2.1中Huffman编码的实现,见当元素权值已经有序时,可以使用A.Moffat和J.Katajainen设计的在权值数组内部构建Huffman的方法。A.Moffat和J.Katajainen对该算法的描述见~alistair/abstracts/inplace.html8.huffman_h在huffman_f的基础上,增加限制码长的功能。限制码长的算法参考了zlib-1.1.4中构造限制码长的Huffman编码的源代码。zlib的源代码见,其中限制长度的算法在tree.c的gen_bitlen()函数中。七.Huffman的java实现:界面类publicclassComFileFrame{publicstaticvoidmain(String[]args){ComFileFramecff=newComFileFrame();cff.showUI();}publicvoidshowUI(){javax.swing.JFrameframe=newjavax.swing.JFrame();frame.setSize(200,100);frame.setLocationRelativeTo(null);frame.setTitle(own压缩软件);frame.setLayout(newjava.awt.FlowLayout());frame.setDefaultCloseOperation(3);frame.setResizable(false);javax.swing.JButtoncomf=newjavax.swing.JButton(压缩);javax.swing.JButtondecomf=newjavax.swing.JButton(解压缩);MouseListenerImplmli=newMouseListenerImpl();comf.addMouseListener(mli);decomf.addMouseListener(mli);javax.swing.JLabellabel=newjavax.swing.JLabel(Copyright@Chenjunqing);label.addMouseListener(mli);frame.add(comf);frame.add(decomf);frame.add(label);frame.setVisible(true);}}鼠标监听器类packagecn.netjava.Huffman;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjavax.swing.JButton;importjavax.swing.JLabel;publicclassMouseListenerImplimplementsMouseListener{publicvoidmouseClicked(MouseEvente){Objectobj=e.getSource();//得到鼠标单击的对象if(objinstanceofJButton){//判断鼠标是否单击是按钮JButtonb=(JButton)obj;Stringtitle=b.getActionCommand();//得到按钮的名称javax.swing.JFileChooserchooser=newjavax.swing.JFileChooser();//创建一个filechooser,用来获取路径if(title==压缩){//判断单击的是哪个按钮chooser.setFileSelectionMode(javax.swing.JFileChooser.FILES_ONLY);//压缩时只允许压缩文件intt=chooser.showDialog(null,压缩);if(t==javax.swing.JFileChooser.APPROVE_OPTION){Stringsource=chooser.getSelectedFile().getAbsolutePath();//得到源文件的路径//System.out.println(sourceis:+source);//fortestStringdestination=source+.own;//根据源文件路径产生新文件的路径//System.out.println(destinationis:+destination);//fortestCompresscomFile=newCompress();try{longstart=System.currentTimeMillis();comFile.compressFile(source,destination);longend=System.currentTimeMillis();longtime=end-start;javax.swing.JOptionPane.showMessageDialog(null,压缩完成!\n+压缩用时:+time+ms+\n);}catch(Exceptione1){e1.printStackTrace();}}}elseif(title==解压缩){chooser.setFileSelectionMode(javax.swing.JFileChooser.FILES_ONLY);intt=chooser.showDialog(null,解压缩);if(t==javax.swing.JFileChooser.APPROVE_OPTION){Stringsource=chooser.getSelectedFile().getAbsolutePath();if(source.endsWith(own)){Stringtemp=source.substring(0,source.length()-4);ints=temp.lastIndexOf(\\);Stringdestination=temp.substring(0,s+1)+解压+temp.substring(s+1,temp.length());//System.out.println(destinationis:+destination);//fortestCompressdecomFile=newCompress();try{longstart=System.currentTimeMillis();decomFile.decompressFile(source,destination);longend=System.currentTimeMillis();longtime=end-start;javax.swing.JOptionPane.showMessageDialog(null,解压完成!\n+解压用时:+time+ms+\n);}catch(Exceptione1){e1.printStackTrace();}}else{javax.swing.JOptionPane.showMessageDialog(null,请选择由本软件压缩的文件);}}}}elseif(objinstanceofJLabel){javax.swing.JOptionPane.showMessageDialog(null,本软件压缩的文件拓展名为own!);}}@OverridepublicvoidmousePressed(MouseEvente){//TODOAuto-generatedmethodstub}@OverridepublicvoidmouseReleased(MouseEvente){//TODOAuto-generatedmethodstub}@OverridepublicvoidmouseEntered(MouseEvente){//TODOAuto-generatedmethodstub}@OverridepublicvoidmouseExited(MouseEvente)
本文标题:实验2-Huffman编码对英文文本的压缩和解压缩
链接地址:https://www.777doc.com/doc-5837083 .html