ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:98.55KB ,
资源ID:8972758      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8972758.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(信息论与编码.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

信息论与编码.docx

1、信息论与编码信 息 论-课程设计报告 班 级: 192081-12指导老师: 余林琛姓 名: 熊松学 号:20081002220实 习 地 点 :信息楼810实 习 日 期 :2010年10月一、 唯一可译码1、 问题描述:在我们学习使用了克拉夫特不等式之后,知道唯一可以码必须满足克拉夫特不等式。但是克拉夫特不等式仅仅是存在性的判定定理,即该定理不能作为判断一种码是否为唯一可译码的依据。也就是说当码字长度和码符号数满足克拉夫特不等式时,则必可以构造出唯一可译码,否则不能构造出唯一可译码。因此我们必须找到一种能够判断一种码是否为唯一可译码的方法-SardinasPatterson算法。2、 需求

2、分析: SardinasPatterson算法描述: 设C为码字集合,按以下步骤构造此码的尾随后缀集合F: (1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中; (2) 考查C和Fi两个集合,若WjC是WiFi的前缀或WiFi 是WjC的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中; (3)F=Fi即为码C的尾随后缀集合; (4) 若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。在我们设计的算法中,需要注意的是我们需要的是先输出所有尾随后缀的集合,然后再判断该码是否是唯一可译码,即如F中出现

3、了C中的元素,则C不是唯一可译码,否则若F中没有出现新的元素,则C为唯一可译码。而不是F中出现C中的元素就终止,这也是在本题的要求中需要注意的问题。3、 概要设计:由于需要判断尾随后缀,所以我们需要反复的比较C和F中的码字。1) 首先我们用一个b3030的数组来存放所有的尾随后缀的集合;用Q记录所有尾随后缀的个数;2) 用数组a3030来存放输入的码字,L30来存放码字的长度;通过一个双重循环并调用houzhui(ai,aj,Li,Lj)函数来找到a3030中的为随后缀,即:for(i=0;in-1;i+) for(j=0;jn;j+) if(i!=j&LiLj) HuoZhui(ai,aj,

4、Li,Lj); 3) 通过判断Q是否大于0,如果不大于0,即b3030中没有码字,也就是不存在尾随后缀,那么可判断a3030是唯一可译码,否则进行如下操作;4) 计算b3030中尾随后缀的长度,用k1表示;并调用HuoZhui(bi,aj,k1,Lj)其中k1Lj来a3030中所存在的后缀,并加入到b3030中,通过一个循环,找到a3030中所有尾随后缀;即 for(i=0;iQ;i+) k1=strlen(bi); for(j=0;jn;j+) if(k1Lj;通过循环调用即可找到b3030中的所有尾随后缀,最后再将他们分别存放在b3030中;即通过 for(i=0;in;i+) for(j

5、=0;jLi) HuoZhui(ai,bj,Li,k2); 6) 在反复调用HuoZhui(ai,aj,Li,Lj)函数中如果b3030中有重复出现的,即尾随后缀相同的不用再次放入b3030中。7) 在调用函数中所需要注意的问题就是一个比较的问题,也就是实现6)中所提到的。4 详细设计如下:#include#includechar b3030;int Q;void HuoZhui(char c,char d,int L1,int L2) int i,j,temp=0; char m30; for(i=0;iL1;i+) if(ci=di)continue; else break; if(i=L

6、1) for(j=0;jL2-L1;j+) mj=dL1+j; mj=0; for(i=0;iQ;i+) if(strcmp(bi,m)=0) temp=1; break; if(temp!=1) strcpy(bQ,m); Q+; void main() int i,j,k,k1,k2,n; char a3030; int L30; int temp=1; int mm=0; printf(请输入码字个数:); scanf(%d,&n); printf(请分别输入码字:n); for(i=0;in;i+) scanf(%s,&ai); Li=strlen(ai); for(i=0;in-1;

7、i+) for(j=0;jn;j+) if(i!=j&Li0) for(i=0;iQ;i+) k1=strlen(bi); for(j=0;jn;j+) if(k1Lj) HuoZhui(bi,aj,k1,Lj); for(k=0;kn;k+) for(j=0;jLk) HuoZhui(ak,bj,Lk,k2); printf(尾随后缀集合为:); for(i=0;iQ;i+) printf(%s ,bi); for(i=0;in&temp!=0;i+) for(j=0;jQ;j+) if(strcmp(ai,bj)=0) temp=0; break; else continue; print

8、f(n); if(temp=0)printf(该码不是唯一可译码!n); else printf(该码是唯一可译码!n); else printf(该码组是唯一可译码!); mm+; printf(n);5测试结果截图如下: 6、需要注意的问题: 主要就是反复调用,稍不注意就会漏掉一些尾随后缀,还有就是在编码是一定要注意,变量的值,就像我在设计该程序时,i的值保留了前面两次循环后的值,导致最后输出尾随后缀时输出不全。二、香农码1、算法思想:主要就是按照老师上课讲的思想,即按以下步骤即可求得香农码:1)、将信源发出的N个消息符号按其概率的递减次序依次排列。2)、按下式计算第i个消息的二进制代码组

9、的码长,并取整。3)、为了编成唯一可译码,首先计算第i个消息的累加概率4)、将累加概率Pi (为小数)变成二进制数5)、去除小数点,并根据码长li ,取小数点后li 位数作为第i个消息的码字。2、概要设计: 1)、其实这主要就是用到一个排序,我用的是冒泡排序算法; 2)、求对数的时候需要转换一下;3)、其余的按上述步骤就可得到。4、 详细设计如下: #include#includevoid main() int n,i,j; float t; float a10;/符号概率; float b10;/累加概率; float c10;/-log(ai); int d10;/码字长度; int m1

10、010;/存码字; printf(请输入消息符号个数:); scanf(%d,&n); printf(请输入各个消息符号所对应的概率:n); for(i=0;in;i+) scanf(%f,&ai); printf(n); /*排序*/ for(j=0;jn;j+) for(i=0;in-j;i+) if(aiai+1) t=ai; ai=ai+1; ai+1=t; printf(按概率从大到小排序后为:n);for(i=0;in;i+)printf(%f ,ai);printf(n);printf(n);/*请累加概率*/for(i=0;in-1;i+) b0=0; bi+1=ai+bi;p

11、rintf(累加概率为:);for(i=0;in;i+)printf(%f ,bi);printf(n);for(i=0;in;i+) ci=(float) (-1)*log(float) ai)/log(float)2); printf(%f ,ci);printf(nn);for(i=0;in;i+) di=(int)ci+1;printf(码字长度分别为:);for(i=0;in;i+)printf(%d ,di);printf(nn);printf(码字为:n);for(i=0;in;i+) for(j=0;jdi;j+) bi=bi*2; mij=(int)(bi); if(mij=

12、1) bi=bi-1; printf(%d,mij); printf( );printf(n);5、 测试截图如下:6、 需要注意问题:本题比较简单,所以只要注意一下细节就可以了。 三 、费诺码1、算法思想: 也就是根据老师上课所讲的步骤就可以了;步骤如下: 1)、将信源发出的N个消息符号按其概率的递减次序依次排列。2)、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予一个二进制代码符号“0”和“1”(编m进制 码就分成m组)。3)、将每一个大组的信源符号进一步再分成两组,使划分后的两个组的概率和近于相同,并又分别赋予两组一个二进制符号“0”和“1”4)、如此重复,直

13、至每组值只剩下一个信源符号为止5)、信源符号所对应的码符号序列即为费诺码2、概要设计1)、首先是有一个排序问题,我用的是直接插入排序;2)、这个算法的核心是分组问题,我是通过一个递归实现的,主要分株思想就是首先计算出所有输入概率的总和的一半;由于排序后的概率是从高到低的,所以用一个逐渐累加求和与总和一半的差,求得差最小的那一个位置,即可得到分组,再通过递归调用即可实现所有的分组,最后得到费诺码。核心分组算法如下:void Block(int p,int q,int L) int i,j,r,t1; float sum1=0,sum2=0,sum3,temp,cz=3; for(i=p;i=q;

14、i+) sum1+=ai; temp=sum1/2; for(i=p;i=0) sum3=sum3*1; else sum3=sum3*(-1);/这两行相当于求差的绝对值 if(sum3cz)cz=sum3;最后可得到差值最小的位置,即可得到分组; else break; 3、详细设计: #includefloat a10;int b2020;void Block(int p,int q,int L) int i,j,r,t1; float sum1=0,sum2=0,sum3,temp,cz=3; for(i=p;i=q;i+) sum1+=ai; temp=sum1/2; for(i=p

15、;i=0) sum3=sum3*1; else sum3=sum3*(-1); if(sum3cz)cz=sum3; else break; for(r=p;ri;r+) bpL=0; if(i-p=1) for(j=0;j=L;j+) printf(%d,bpj); printf( ); else Block(p,i-1,L+1); for(t1=i;t1=q;t1+) bt1L=1; if(i=q) for(j=0;j=L;j+) printf(%d,bij); printf( ); else Block(i,q,L+1); void main() int i,j,n,num=0,k1=0

16、; float temp,k=1; printf(请输入码字个数:); scanf(%d,&n); printf(请分别输入各码字:n); for(i=0;in;i+) scanf(%f,&ai); printf(按概率从大到小排序后为:n); /排序(直接插入排序); for(i=0;i-1&tempaj) aj+1=aj; j-; aj+1=temp; for(i=0;in;i+) printf(%f ,ai); printf(n); printf(费诺码为:); Block(0,n-1,0); printf(n);4、运行截图如下: 5、需要注意的问题: 本题中需要注意的问题就是分组时候需要注意,不要分错了,我觉得虽然在本题中递归很重要,但最重要的应该是分组。还有我所遇到的问题就是传递参数L的时候需要特别注意,就是由于这个问题还花费了两个小时去调试,这个问题导致调试时间比写代码的时间更长。所以传递参数时一定要特别注意。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1