信息论实验报告1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P(x|y)
年级 08级 专业 网络工程 实验 Huffman编码 名称 班号 2
学号 姓名 实验 类型
08066040 苗壮 设计型 综合型 创 新 型
实 验 目 的 或 要 求
1、计算每信源的平均字长,并与信源符号熵比较。 2、计较压缩效果。
实 验 原 理 ( 算 法 流 程 图 或 者 含 注 释
含 注 释 的 源 代 码 )
huffstring=new String[buffer.length()]; codes=new HuffmanCode[2*buffer.length()-1]; for(int i=0;i<2*buffer.length()-1;i++) codes[i]=new HuffmanCode(); for(int i=0;i<buffer.length();i++){ codes[i].name=buffer.substring(i,i+1); codes[i].weight=haveNum(buffer.charAt(i),s); } getHuffstring(); getCode(2*buffer.length()-2,huffstring,""); for(int i=0;i<huffstring.length;i++){ System.out.println(codes[i].name+" code:"+huffstring[i]); } System.out.println("编码:"+getHuffmanCode(s)); System.out.println("平均码长为:"+getLength()); } public double getLength(){ double n=0; for(int i=0;i<buffer.length();i++){ n+=huffstring[i].length(); } return n/buffer.length(); } public String getHuffmanCode(String s){ StringBuffer buf=new StringBuffer(); for(int i=0;i<s.length();i++){ buf.append(getEachCode(s.substring(i,i+1))); } return buf.toString(); } public String getEachCode(String name){ for(int i=0;i<buffer.length();i++){ if(name.equals(codes[i].name)){ return huffstring[i]; } } return "";
的 则: 源 A) 任意取定P(X),可以求出一个使I最大的。 代 B) 在变动0P(X),求出使0最大的P(X)值。 码 P(X)= ) 重复A) B)两步,可以得到C的近似值。
实 验 原 理 ( 算 法 流 程 图 或 者 含 注
一、搜索法代码: public class SearchMax { double Imax; double[] px0; double p00,p01,p10,p11; public SearchMax() { px0=new double[1000]; p00=0.8;p01=0.5;p10=0.2;p11=0.5; double I; int n=0; for(int i=0;i<px0.length;i++){ px0[i]=Math.random(); I=C(px0[i]); if(Imax<I){ n=i; Imax=I; } } System.out.println("概率为:"+px0[n]+",信道容量
的 源 代 码 )
的集合F中。 重复(2)和(3),直到下只含一棵树为止,这棵树便是哈弗曼 树。 5.一颗有n个叶子结点的哈弗曼树共有2n-1个结点,可以以以大小 为2n-1的向量表示。由于在构成哈弗曼树之后,为求编码需从叶子 结点出发走一条从叶子到根的路径;对不同的路径的选择代表不同 的编码(如左子树表示0,则右子树表示1),而为译码需从根出发 走一条从根到叶子的路径。则对每个结点而言,既需知双亲的信 息,又需知孩子结点的信息。 译码的过程是分解电码文中字符串,从根出发,按字符‘0’或‘1’确 定找左孩子或右孩子,直至叶子结点,便求得该孩子串相应的字 符。 一、 Huffman编码代码: import java.util.*; class HuffmanCode{ String name; double weight; int lc,rc,pa; public HuffmanCode(){ name=""; weight=0; lc=-1;rc=-1;pa=-1; } }
实 验 目 的 或 要 求
1、 掌握信道容量的物理意义、概念。 2、 了解信道容量的计算方法。 3、 用Java编程实现算法。 4、算法为有限搜索法和迭代法。
实 验 原 理 ( 算 法 流 程 图 或 者 含 注 释
1.(离散)信道的物理模型为: 信道容量定义为平均互信息的最大值:C=MAX{I (X,Y)}。 2.信道容量表征了一个信道的传送信息的最大能力,实际中传送 的信息量必须小于信道容量,否则在传送过程中会出现错误。
X(n) Y(n)
3.由信道容量的定义知道:I(X,Y)的值是由信道的传送概率决定 的,因而决定了信道的信道容量。 4.给定了信道的传送概率的情况下,可以通过推导的方法求得信 道的信道容量,一般可以求出传送效率达到信道容量的时候的输 入信号的分布。但是这种方法不利用用计算机实现,另一种方法 是迭代法,适合用计算机实现。 5.迭代法:对于信道:{X,P(Y|X),Y}有: C={I(X,Y)} ={log} ={[log} ={{[log}}
} public double haveNum(char c,String s){ double n=0; for(int i=0;i<s.length();i++){ if(c==s.charAt(i))n++; } return n/s.length(); } public static void main (String[] args) { System.out.print("输入编码字符串:"); Scanner sr=new Scanner(System.in); new Huffman(sr.nextLine()); } }
实 验 原 理 ( 算 法 流 程
二、实验结果截图:
图 或 者 含 注 释 的 源 代 码 )
一、 实验结果分析 通过搜索法,遍历了1000个输入信号的情况,从中 找出平均互信息的极大值C,将其作为信道容量。由于
实 验 结 果 分 析 及 心 得 体 会
1000个信号并不是少数,因此可以近似的认为已将所有 的情况考虑到,由此得出的结果比较可信。这里搜索的 次数越大越好,不过考虑到计算机的运算与实际的意 义,因此这次实验足够反映实际情况。
实 验 原 理 ( 算 法 流 程 图 或 者Biblioteka Baidu
public class Huffman { HuffmanCode[] codes; String[] huffstring; StringBuffer buffer=new StringBuffer(); public Huffman(String s) { for(int i=0;i<s.length();i++){ if(buffer.indexOf(s.substring(i,i+1))==-1){ buffer.append(s.charAt(i)); } } System.out.println("字母:"+buffer);
1. 最优码:按源字出现的概率而编的码,其平均码长为最短则称 为最优码 2. 新源编码定理; 对于符号熵为H(X)的离散无记忆的平稳信源,必存在一种 无失真编码,是每符号平均码长满足不等式:H(X)-L<=H(X)+ε, (ε>0) 3.Huffman码是一种最优码。 若将编码设计为长度不等的的二进制编码,即让字符串中出现次 数较多的字符采用尽可能短的编码,则转换的二进制字符串便可能 减少。 4.Huffman算法 哈弗曼最早给出了一个带有一般规律的算法,俗称哈弗曼算法。 现叙述如下: (1)、根据给定的n个权值…1,w2,…,wJ构成n棵二叉树的集合F= {T1,T2,…,Tn} ,其中每棵二叉树T1中只有一个带权为wi的根节点,其左右子树均 为空。 (2)、在下中选取两棵根节点的权值最小的树作为左右子树构造 一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树 上根结点的权值之和。 (3)、在下中删除这两棵树,同时将新得到的二叉树加入二叉树
实 验 原 理 ( 算 法 流 程 图
或 者 含 注 释 的 源 代 码 )
} public void getCode(int n,String[] thecodes,String thebuffer){ if(n<thecodes.length){ thecodes[n]=thebuffer; return; } getCode(codes[n].lc,thecodes,thebuffer+"0"); getCode(codes[n].rc,thecodes,thebuffer+"1"); } public void getHuffstring(){ int[] twos={0,0}; for(int i=buffer.length();i<2*buffer.length()-1;i++){ twos=findLastTwo(0,i); codes[i].lc=twos[0]; codes[i].rc=twos[1]; codes[i].weight=codes[twos[0]].weight+codes[twos[1]].weight; } } public int[] findLastTwo(int start,int end){ double[] weights={1.0,1.0}; int[] t={-1,-1}; for(int i=start;i<end;i++){ if(codes[i].pa!=-1)continue; if(weights[0]>codes[i].weight){ weights[0]=codes[i].weight; t[1]=t[0]; t[0]=i; } else if(weights[1]>codes[i].weight){ weights[1]=codes[i].weight; t[1]=i; } } codes[t[0]].pa=end; codes[t[1]].pa=end; return t;
释 为:"+Imax); 的 } 源 double C(double px){ 代 double py0,py1,HY,HY_X; 码 double px_=1.0-px; )
py0=p00*px+p01*px_; py1=p10*px+p11*px_; HY=-py0*Math.log(py0)/Math.log(2.0)py1*Math.log(py1)/Math.log(2.0); HY_X=-px*p00*Math.log(p00)/Math.log(2.0)px*p10*Math.log(p10)/Math.log(2.0)px_*p01*Math.log(p01)/Math.log(2.0)px_*p11*Math.log(p11)/Math.log(2.0); return HY-HY_X; } public static void main (String[] args) { new SearchMax(); } }
二、心得体会 通过这次实验,我了解到信道容量的定义:在信道固 定的条件下,平均互信息对所有可能的输入分布的极大 值。这里所用的思想就是穷举法,通过研究多个信号来 确定信道容量。在实际中也应该用这种思想解决类似的 问题,而且要选取典型的数值,个数应该能准确反映情 况,这样得出的结果才是有意义的。
成 绩 评 定 教师签名: 年 月 日
院 系: 计算机科学学院 专 业: 网络工程 年 级: 08级 课程名称: 信息论基础 学 号: 08066040 姓 名: 苗壮 指导教师: 佘伟 2010年 12月 20日
年级 08级 专业 网络工程 班号 2 实验 信道容量的计算 名称
学号 姓名 实验 类型
08066040 苗壮 设计型 综合型 创 新 型