logo资料库

信息论与编码课程设计实验报告java.docx

第1页 / 共32页
第2页 / 共32页
第3页 / 共32页
第4页 / 共32页
第5页 / 共32页
第6页 / 共32页
第7页 / 共32页
第8页 / 共32页
资料共32页,剩余部分请下载后查看
计算机与信息学院 信息论与编码课程设计 实验报告 专 业 班 级 学生姓名及学号 课 程 教 学 班 号 任 课 教 师 实 验 指 导 教 师 实 验 地 点 信息安全 11-1 班 0001 逸夫科技楼 507 2013~2014 学年第一学期
实验一:对任意的符号序列(abbcccdddddeeeeee)进 行 n 元 Huffman 的编码实现 一、问题描述 Huffman 编码是一种常用的压缩编码方法,是 Huffman 与 1952 年为压缩文本文件建立 的。它的基本原理是按照概率大小的顺序排列信源符号,并设法按逆顺序分配码字字长,使 编码的码字为可辨识的。Huffman 码是最佳码。 本次课程设计主要是实现对任意的符号序列进行 n 元 Huffman 的编码。 二、基本要求 本程序需要达到的要求是:由使用者输入信源符号(如:abbcccdddddeeeeee)、编码的 元数(n)。后运行程序,程序输出每个符号的编码以及信源符号串的编码。再将编码结果输 入,译码得出原序列。 三、测试数据 1. 输入符号序列为:abbcaddacaeffghgi 元数为:5
四、算法思想 本算法的 n 元编码过程实现如下: (1)将 q 个信源按概率分布大小依次排列; (2)计算实际所需的信源符号数【根据公式:q =(n - 1)θ+ n】; (3)用 0,1,2,……,n-1 分别代表概率最小的 n 个信源符号,并将这 n 个概率最小的 信源符号合并成一个新的符号,并将这 n 个符号标记为 true。使得标记为 false 的符号数 为 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)将取出的字符与编码后的编码结果进行比对。若一致则输出与编码结果对应的符号,
并将 char 数组中的下一个字符作为起始字符。否则取 char 数组的前两个进行比对,如此 循环下去。 五、模块划分 1.计算实际需要的符号数 for(int i=0;inode_array[j].frequency){ HuffmanNode x; x=node_array[i]; node_array[i]=node_array[j]; node_array[j]=x;
} } } } if(circle_times!=1){ int j=real_sum-1; for(int i=real_sum-2;i>=0;i--){ if(node_array[i].frequency>node_array[j].frequency){ HuffmanNode x; x=node_array[i]; node_array[i]=node_array[j]; node_array[j]=x; j--; } } } 4. 给出每个符号的码符号 for(int i=0;i
node_array[real_sum].frequency=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; } else hn.code= hn.next.code+ hn.code; //System.out.println(hn.code); } } 7.译码程序 class ButtonListener2 implements ActionListener{ public 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_array[0]); for(int i=0;i
} } } 六、源程序 import javax.swing.*; import java.awt.Color; import java.awt.event.*; class HuffmanNode { //建立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 JFrame{ static public int n; static public int sum; static public int real_sum; static public char sign[]=new char[50];//存放输入的符号 static public int times[]=new int[50]; ButtonListener bl =new ButtonListener(); ButtonListener2 b2 =new ButtonListener2(); JTextField tf1=new JTextField(); JTextField tf2=new JTextField(); JTextField tf3=new 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=new 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); 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.setBackground(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);
分享到:
收藏