资源预览内容
第1页 / 共23页
第2页 / 共23页
第3页 / 共23页
第4页 / 共23页
第5页 / 共23页
第6页 / 共23页
第7页 / 共23页
第8页 / 共23页
第9页 / 共23页
第10页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
信息论与编码实验报告班级: 学号:姓名: 完成时间:2011 年 6 月 2 日实验 2 Huffman 编码对英文文本的压缩和解压缩一、实验内容根据信源压缩编码Huffman 编码的原理,制作对英文文本进行压缩和解压缩的软件。要求软件有简单的用户界面,软件能够对运行的状态生成报告,分别是:字符频率统计报告、编码报告、压缩程度信息报告、码表存储空间报告。二、实验环境1. 计算机2. Windows 2000 或以上3. Microsoft Office 2000 或以上4. VC+ 6.05. MSDN 6.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 使用 Canonical Huffman 编码,同时对 huffman_b 的存储结构进行改造,将二叉树存放在连续空间 tree 里,空间的每个结点类型都和结点权值的数据类型相同,空间大小为 2*num,tree0未用, tree1.num是每个元素的权值,生成 Huffman 后,tree1.2*num-1中是双亲结点索引。4. huffman_d 在 huffman_c 的基础上,增加预先排序的功能先用 QuickSort 算法对所有元素的权值从小到大排序,这样,排序后最前面的两个元素就是最小的一对元素了。我们可以直接将它们挑出来,组合成一个子树。然后再子树的权值用折半插入法插到已排序的元素表中, 保证所有结点有序。为了保证初始元素的顺序不变,我们另外使用了一个索引数组,所有排序中的交换操作都是在索引数组中进行的。5. huffman_e 在 huffman_d 的基础上,将索引数组放在 tree 的内部。为编码方便,将元素权值放在 treenum.2*num-1处。将 tree0.num-1作为索引数组。排序改为从大到小。对索引数组排序后,每次从最后选出 2 个最小值,相加后的结点权值放在索引数组最后,结点索引放在索引数组中倒数第 2 个位置,然后索引数组大小减 1,并将最后一个索引值插入到前面的有序表中,保证索引数组仍然有序。6. huffman_f 在 huffman_e 的基础上,将排序改为利用堆排序原理选择最小的两个权值。也即,将所有元素的权值组织成堆后,每次堆内的根结点就是最小值了。每取出一个根结点后,就把堆尾元素调到根结点重建堆。取出两个最小值合并成一个子树后,再把子树作为叶子结点放到堆中,并让其上升到合适的位置,保持堆性质不变。因为每次不必完成整个排序过程,而只是组织成堆,因此,这种方法要比使用快速排序更快。上述算法参考了 mg-1.2.1中 Huffman 编码的实现,见 http:/www.cs.mu.oz.au/mg/7. huffman_g 当元素权值已经有序时,可以使用 A. Moffat 和 J. Katajainen 设计的在权值数组内部构建 Huffman 的方法。A. Moffat 和 J. Katajainen 对该算法的描述见http:/www.cs.mu.oz.au/alistair/abstracts/inplace.html8. huffman_h 在 huffman_f 的基础上,增加限制码长的功能。限制码长的算法参考了zlib-1.1.4 中构造限制码长的 Huffman 编码的源代码。 zlib 的源代码见http:/www.gzip.org/zlib/,其中限制长度的算法在 tree.c 的 gen_bitlen()函数中。七Huffman 的 java 实现:界面类public class ComFileFrame public static void main(String args)ComFileFrame cff = new ComFileFrame();cff.showUI();public void showUI()javax.swing.JFrame frame = new javax.swing.JFrame();frame.setSize(200, 100);frame.setLocationRelativeTo(null);frame.setTitle(own 压缩软件);frame.setLayout(new java.awt.FlowLayout();frame.setDefaultCloseOperation(3);frame.setResizable(false);javax.swing.JButton comf = new javax.swing.JButton(压缩);javax.swing.JButton decomf = new javax.swing.JButton(解压缩);MouseListenerImpl mli = new MouseListenerImpl();comf.addMouseListener(mli);decomf.addMouseListener(mli);javax.swing.JLabel label = new javax.swing.JLabel(Copyright Chenjunqing);label.addMouseListener(mli);frame.add(comf);frame.add(decomf);frame.add(label);frame.setVisible(true);鼠标监听器类package cn.netjava.Huffman;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JButton;import javax.swing.JLabel;public class MouseListenerImpl implements MouseListenerpublic void mouseClicked(MouseEvent e) Object obj = e.getSource();/得到鼠标单击的对象if(obj instanceof JButton)/判断鼠标是否单击是按钮JButton b = (JButton) obj;String title = b.getActionCommand();/得到按钮的名称javax.swing.JFileChooser chooser = new javax.swing.JFileChooser();/创建一个filechooser,用来获取路径if(title=压缩)/判断单击的是哪个按钮chooser.setFileSelectionMode(javax.swing.JFileChooser.FILES_ONLY);/压缩时只允许压缩文件int t = chooser.showDialog(null, 压缩);if(t = javax.swing.JFileChooser.APPROVE_OPTION)String source = chooser.getSelectedFile().getAbsolutePath();/得到源文件的路径/ System.out.println(source is :+source);/ for testString destination = source+.own;/根据源文件路径产生新文件的路径/ System.out.println(destination is:+destination);/ for testCompress comFile = new Compress();try long start = System.currentTimeMillis();comFile.compressFile(source, destination);long end = System.currentTimeMillis();long time = end -start;javax.swing.JOptionPane.showMessageDialog(null, 压缩完成!n+压缩用时:+time+ms+n); catch (Exception e1) e1.printStackTrace();else if(title=解压缩)chooser.setFileSelectionMode(javax.swing.JFileChooser.FILES_ONLY);int t = chooser.showDialog(null, 解压缩);if(t = javax.swing.JFileChooser.APPROVE_OPTION)String source = chooser.getSelectedFile().getAbsolutePath();if(source.endsWith(own)String temp = source.substring(0,source.length()-4);int s = temp.lastIndexOf();String destination = temp.substring(0,s+1)+解压 +temp.substring(s+1,temp.length();/ System.out.println(destination is:+destination);/ for testCompress decomFile = new Compress();try long start = System.currentTimeMillis();decomFile.decompressFile(source, destination);long end = System.currentTimeMillis();long time = end -start;javax.swing.JOptionPane.showMessageDialog(null, 解压完成!n+解压用时:+time+ms+n); catch (Exception e1) e1.printStackTrace();else javax.swing.JOptionPane.showMessageDialog(null, 请选择由本软件压缩的文件)
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号