[工学]信息论与编码课程设计实验报告.doc
《[工学]信息论与编码课程设计实验报告.doc》由会员分享,可在线阅读,更多相关《[工学]信息论与编码课程设计实验报告.doc(32页珍藏版)》请在三一办公上搜索。
1、计算机与信息学院 信息论与编码课程设计 实验报告专 业 班 级 信息安全11-1班 学生姓名及学号 课程教学班号 0001 任 课 教 师 实验指导教师 实验地点 逸夫科技楼507 20132014学年第一学期实验一:对任意的符号序列(abbcccdddddeeeeee)进行n元Huffman的编码实现一、问题描述Huffman编码是一种常用的压缩编码方法,是Huffman与1952年为压缩文本文件建立的。它的基本原理是按照概率大小的顺序排列信源符号,并设法按逆顺序分配码字字长,使编码的码字为可辨识的。Huffman码是最佳码。本次课程设计主要是实现对任意的符号序列进行n元Huffman的编码
2、。二、基本要求本程序需要达到的要求是:由使用者输入信源符号(如:abbcccdddddeeeeee)、编码的元数(n)。后运行程序,程序输出每个符号的编码以及信源符号串的编码。再将编码结果输入,译码得出原序列。三、测试数据1.输入符号序列为:abbcaddacaeffghgi 元数为:5四、算法思想本算法的n元编码过程实现如下:(1)将q 个信源按概率分布大小依次排列;(2)计算实际所需的信源符号数【根据公式:q =(n - 1)+ n】;(3)用0,1,2,n-1分别代表概率最小的n个信源符号,并将这n个概率最小的信源符号合并成一个新的符号,并将这n个符号标记为true。使得标记为false
3、的符号数为q-n+1 个,构成的新信源S1; (4)把信源S1的符号仍按概率大小依递排列,并将其最后n 个概率最小的符号合并成一个符号,并分别用0,1,2,r-1码符号表示。这样就形成了标记为false的q-2(n-1)个符号组成的信源S2;(5)依次继续下去,直至信源最后只剩下n个符号为止。将这最后n个信源符号分别用n进制符号0,1,r-1 表示;(6)最后,通过递归函数从最后一级缩减信源开始,向前返回,就得出各信源符号所对应的码符号序列,即相应的码字。译码过程如下:(1)将输入的字符串转换成char类型数组,取出第一个字符,作为起始字符;(2)将取出的字符与编码后的编码结果进行比对。若一致
4、则输出与编码结果对应的符号,并将char数组中的下一个字符作为起始字符。否则取char数组的前两个进行比对,如此循环下去。五、模块划分1.计算实际需要的符号数for(int i=0;isum;i+)timesi=0;for(int i=0;isum;i+)for(int j=0;jget_sign.length;j+)if (signi=get_signj)timesi+;/System.out.print(timesi+ );for(int i=0;)if(real_sum=i*(n-1)+n)sum)i+;else break; 2. 建立Huffman结点class HuffmanNod
5、e /建立Huffman编码结点 public int frequency;public boolean flag;public char name;public String code;public HuffmanNode next;HuffmanNode(char name,int frequency,boolean flag)this.name=name;this.frequency=frequency;this.flag=flag;this.code=;this.next=null;3. 对HUFFMAN结点数组进行排序if(circle_times=1)for(int i=0;ire
6、al_sum;i+)for(int j=i+1;jnode_arrayj.frequency)HuffmanNode x;x=node_arrayi;node_arrayi=node_arrayj;node_arrayj=x;if(circle_times!=1)int j=real_sum-1;for(int i=real_sum-2;i=0;i-)if(node_arrayi.frequencynode_arrayj.frequency)HuffmanNode x;x=node_arrayi;node_arrayi=node_arrayj;node_arrayj=x;j-; 4. 给出每个
7、符号的码符号for(int i=0;ireal_sum;i+)if(count2!=n&node_arrayi.flag=false)String temp=null;temp=Integer.toString(count2);/System.out.println(temp);node_arrayi.code=temp;/System.out.println(node_arrayi.name+ +node_arrayi.code);count2+; 5. 合并n个符号node_arrayreal_sum=new HuffmanNode(*,combine,false);/建立新的huffma
8、n结点for(int i=0;ireal_sum;i+)if(count!=n&node_arrayi.flag=false&false_num!=n)combine=combine+node_arrayi.frequency;count+;node_arrayi.flag=true;node_arrayi.next=node_arrayreal_sum;/System.out.println(node_arrayi.name+ +node_arrayi.next.frequency);/System.out.println(combine);node_arrayreal_sum.freque
9、ncy=combine;real_sum+; 6.输出码符号序列的递归程序public void encode(HuffmanNode hn)if(hn.next!=null&hn.next.code!=null)if(hn.next.flag!=false)encode(hn.next);hn.code=hn.next.code+hn.code;hn.flag=false;elsehn.code= hn.next.code+ hn.code;/System.out.println(hn.code); 7.译码程序class ButtonListener2 implements ActionL
10、istenerpublic void actionPerformed(ActionEvent e)String s = e.getActionCommand();if(开始译码 = s)ta.append(译码结果为:+n);String get_yima;get_yima=tf3.getText();char yima_array;yima_array=get_yima.toCharArray();String str=String.valueOf(yima_array0);for(int i=0;iyima_array.length;i+)for(int j=0;jreal_sum;j+)
11、/System.out.println(str);if(str.equals(node_arrayj.code)&node_arrayj.name!=*)ta.append(String.valueOf(node_arrayj.name);str=;/System.out.println(0);break;if(i=yima_array.length-2)str=str+String.valueOf(yima_arrayi+1);六、源程序import javax.swing.*;import java.awt.Color;import java.awt.event.*;class Huffm
12、anNode /建立Huffman编码结点 public int frequency;public boolean flag;public char name;public String code;public HuffmanNode next;HuffmanNode(char name,int frequency,boolean flag)this.name=name;this.frequency=frequency;this.flag=flag;this.code=;this.next=null;class N_Huffman_Jframe extends JFramestatic pub
13、lic int n;static public int sum;static public int real_sum;static public char sign=new char50;/存放输入的符号static public int times=new int50;ButtonListener bl =new ButtonListener();ButtonListener2 b2 =new ButtonListener2();JTextField tf1=new JTextField();JTextField tf2=new JTextField();JTextField tf3=new
14、 JTextField();JTextArea ta=new JTextArea();/N_Huffman_Jframe(String title)super(title);this.setSize(500,360);this.setLocation(400, 200);addWindowListener( / 窗口监听器new WindowAdapter() public void windowClosing(WindowEvent e) / 关闭所有窗体System.exit(0););JPanel p=new JPanel();p.setLayout(null);JLabel l1=ne
15、w JLabel(请输入符号序列);l1.setFont(new java.awt.Font(微软雅黑,4,15);l1.setBounds(10, 13, 120,20);tf1.setBounds(125, 10,350, 30);JLabel l2=new JLabel(元数);l2.setBounds(355, 58, 50,20);l2.setFont(new java.awt.Font(微软雅黑,4,15);tf2.setBounds(395,55,80, 30);JButton ok=new JButton(确认);ok.setBounds(355, 100, 120, 35);
16、ok.setBackground(Color.white);ok.setFont(new java.awt.Font(微软雅黑,4,15);ok.addActionListener(bl);JLabel l4=new JLabel(需要译码序列);l4.setFont(new java.awt.Font(微软雅黑,4,15);l4.setBounds(10, 250, 90, 20);tf3.setBounds(110, 245, 365, 30);JButton yima=new JButton(开始译码);yima.setBounds(170, 282, 200, 30);yima.set
17、Background(Color.white);yima.setFont(new java.awt.Font(微软雅黑,4,15);yima.addActionListener(b2);ta.setBounds(15, 50, 330, 180);ta.setLineWrap(true);JScrollPane jsp=new JScrollPane(ta);jsp.setBounds(15, 50, 330, 180);this.add(p);p.add(l1);p.add(tf1);p.add(l2);p.add(tf2);p.add(ok);p.add(l4);p.add(tf3);p.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工学 信息论 编码 课程设计 实验 报告
链接地址:https://www.31ppt.com/p-4532376.html