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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

信息论课程设计报告.docx

1、信息论课程设计报告 成绩: 2016-2017学年第1学期信息论课程设计学院名称: 班级学号: 学生: 教师: 2016年 12 月 1、判定唯一可译码1. 任务说明 输入:任意的一个码(即已知码字个数及每个具体的码字) 输出:判决结果(是/不是) 输入文件:in1.txt,含至少2组码,每组的结尾为”$”符 输出文件:out1.txt,对每组码的判断结果 说明:为了简化设计,可以假定码字为0,1串2. 实现原理 判断方法:将码C中所有码字可能的尾随后缀组成一个集合F,当且仅当集合F中没有 包含任一码字,则可判断此码C为唯一可译变长码。 构成集合F:首先观察码C中最短的码字是否是其他码字的前缀

2、。若是,将其所有可能 的尾随后缀排列出。就是将其他码字序列中截去与其最短码字相同的前缀 部分,将余下的序列为尾随后缀。而这些尾随后缀又可能是某些码字的前 缀,或者最短码字又仍是这些尾随后缀的前缀,再将由这些尾随后缀产生 的新的尾随后缀列出。然后再观察这些新的尾随后缀是否是某些码字的前 缀,或观察有否其他码字是这些新的尾随后缀的前缀,再将产生的尾随后 缀列出,依次下去,直至没有一个尾随后缀是码字的前缀或没有新的尾随 后缀产生为止。这样,首先获得的是由最短码字能引起的所有尾随后缀。 接着,按照上述步骤将次短的码字、.所有码字可能产生的尾随后缀前部 列出。由此得到由码C的所有可能的尾随后缀组成的集合

3、F。 参考算法伪代码:For all do if 是的前缀 then将相应的后缀作为一个尾随后缀放入集合中End ifEnd forLoopFor all do For all doif 是的前缀 then将相应的后缀作为一个尾随后缀放入集合中Else if 是的前缀 then将相应的后缀作为一个尾随后缀放入集合中End ifEnd for End forIf thenReturn falseElse if F 中未出现新的元素 thenReturn trueEnd if/能走到这里,说明F中有新的元素出现,需继续 End loop3. 实现源码 #include #include #incl

4、ude #include using namespace std; #pragma warning(disable:4996) char c10050; /保存码字 char f30050; /保存尾随后缀 int N, sum = 0; /N为码字的个数,sum为尾随后缀个数 int flag; /判断是否唯一可译标志位 /检测尾随后缀 void patterson(char c, char d) int i, j, k; for (i = 0; i+) If (ci = 0&di = 0)/两字符串一样长,跳出 break; if (ci = 0) /d比c长,将d的尾随后缀放入f中 fo

5、r (j = i; dj != 0; j+) fsumj - i = dj; fsumj - i = 0; for (k = 0; ksum; k+) if (strcmp(fsum, fk) = 0) /*查看当前生成的尾随后缀在f集合中 是否存在*/ sum-; break; sum+; break; if (di = 0) /c比d长,将c的尾随后缀放入f中 for (j = i; cj != 0; j+) fsumj - i = cj; fsumj - i = 0; for (k = 0; ksum; k+) if (strcmp(fsum, fk) = 0) /*查看当前生成的尾随后

6、缀在f集合中 是否存在*/ sum-; break; sum+; break; if (ci != di)/字符不一样了也退出(前缀不同) break; void main() int k = 0, N = 0, m = 0, a50, z = 0; am = N; m+; fstream file1; file1.open(out1.txt); /码字读取 FILE *file; file = fopen(in1.txt, r+); int num = fgetc(file) - 48; for (int n = 0; n num; n+) int i = 0, j; if (fgetc(f

7、ile) = ) N += (fgetc(file) - 48); else N += (fgetc(file) - 48); am = N; m+; fgetc(file); for (k; k N; k+) for (int q = 0; q+) char temp = fgetc(file); ckq = temp; if (temp = | temp = $) ckq = 0; break; /生成尾随后缀 flag = 0; for (i = az; iN - 1; i+)/判断码本身是否重复 for (j = i + 1; jN; j+) if (strcmp(ci, cj) =

8、0) flag = 1; break; if (flag = 1)/如果码本身有重复,就可以断定它不是唯一可译码 for (int y = az; y N; y+) file1 cy ; file1 不是唯一可译码。n; else for (i = az; iN - 1; i+) /*将原始码字生成的尾随后缀集合s1放入f 中*/ for (j = i + 1; jN; j+) patterson(ci, cj); for (i = 0; i+) /根据原始码与si生成si+1也放入fi int s = 0; for (j = az; jN; j+) /*判断si+1中的字符串是否与si中一

9、样 ,重复的则不再添加*/ if (i = sum) s = 1; break; else patterson(fi, cj); if (s = 1)break; for (i = 0; isum; i+) /*判断尾随后缀与原始码字是否相同, 相同则不是唯一可译码*/ for (j = az; jN; j+) if (strcmp(fi, cj) = 0) flag = 1; break; if (flag = 1) for (int y = az; y N; y+) file1 cy ; file1 不是唯一可译码。n; else for (int y = az; y N; y+) fil

10、e1 cy ; file1 是唯一可译码。n; file1 尾随后缀集合为:; for (i = 0; i sum; i+) file1 fi ; file1 =p2=p3=.=pq (2)用0和1码符号分别分配给概率最小的两个信源符号,并将这两个 概率最小的信源符号合并成一个信服好,并用这两个最小概率之和 作为新符号的概率,从而得到只包含q-1个服啊后的新信源,称为 S信源的缩减信源S1。 (3)把缩减信源S1的符号仍按概率大小以递减次序排列,再将其最后两 个概率最小的符号合并成一个新符号,并分别用0和1码符号表示, 这样又形成了q-2个符号的缩减信源S2。 (4)依次继续下去,直至缩减信源

11、最后只剩两个符号为止。将这最后两 个符号分别用0和1码符号表示。最后这两个符号的概率之和必为 1。然后从最后一级缩减信源开始,依编码路径由后向前返回,就得 出各信源符号所对应的码符号序列,即得对应的码字。Huffman码参考算法伪代码:if q=2 then Return Else降序排序缩减信源:创建一个符号以取代,其概率递归调用Huffman算法以得到的编码(相应的概率分布为)Return End if3. 实现源码#include #include #include #include #include #pragma warning(disable:4996)#define N 100#

12、define M 2*N-1typedef char * HuffmanCode2 * M;/haffman编码using namespace std;char x100;char y100;fstream in(in2.txt);fstream out(out2.txt);void youchengbianma(char a100) char yc100; int i = 0, j = 0, jishu = 1; yc0 = a0; for (i = 0; ai != 0; i+) if (ai = ai + 1) jishu+; else ycj + 1 = jishu + 48; j =

13、 j + 2; ycj = ai + 1; jishu = 1; ycj = 0; cout 游程编码后: yc endl; strcpy_s(x, yc);void youchengyima(char a100) char bz = 0, jieya100, j, jishu; for (int i = 0; ai != 0; i = i + 2) jieyabz = ai; for (j = bz, jishu = 1; jishu = ai + 1 - 48; jishu+, j+) jieyaj = ai; bz = j; jieyaj = 0; cout 游程译码后: jieya e

14、ndl; out 游程译码后: jieya endl;typedef struct int weight;/权值 int parent;/父节节点 int LChild;/左子节点 int RChild;/右子节点HTNode, HuffmanM + 1;/huffman树typedef struct Node int weight; /叶子结点的权值 char c; /叶子结点 int num; /叶子结点的二进制码的长度WNode, WeightNodeN;/*产生叶子结点的字符和权值*/void CreateWeight(char ch, int *s, WeightNode CW, i

15、nt *p) int i, j, k; int tag; *p = 0;/叶子节点个数 /统计字符出现个数,放入CW for (i = 0; chi != 0; i+) tag = 1; for (j = 0; ji; j+) if (chj = chi) tag = 0; break; if (tag) CW+*p.c = chi; CW*p.weight = 1; for (k = i + 1; chk != 0; k+) if (chi = chk) CW*p.weight+;/权值累加 *s = i;/字符串长度/*创建HuffmanTree*/void CreateHuffmanTr

16、ee(Huffman ht, WeightNode w, int n) int i, j; int s1, s2; /初始化哈夫曼树 for (i = 1; i = n; i+) hti.weight = wi.weight; hti.parent = 0; hti.LChild = 0; hti.RChild = 0; for (i = n + 1; i = 2 * n - 1; i+) hti.weight = 0; hti.parent = 0; hti.LChild = 0; hti.RChild = 0; for (i = n + 1; i = 2 * n - 1; i+) for

17、(j = 1; j = i - 1; j+) if (!htj.parent) break; s1 = j; /找到第一个双亲为零的结点 for (; j htj.weight ? j : s1; hts1.parent = i; hti.LChild = s1; for (j = 1; j = i - 1; j+) if (!htj.parent) break; s2 = j; /找到第二个双亲为零的结点 for (; j htj.weight ? j : s2; hts2.parent = i; hti.RChild = s2; hti.weight = hts1.weight + hts

18、2.weight;/权值累加 /*叶子结点的编码*/void CrtHuffmanNodeCode(Huffman ht, char ch, HuffmanCode h, WeightNode weight, int m, int n) int i, c, p, start; char *cd; cd = (char *)malloc(n*sizeof(char); cdn - 1 = 0;/末尾置0 for (i = 1; i = n; i+) start = n - 1; /cd串每次从末尾开始 c = i; p = hti.parent;/p在n+1至2n-1 while (p) /沿父

19、亲方向遍历,直到为0 start-;/依次向前置值 if (htp.LChild = c)/与左子相同,置0 cdstart = 0; else /否则置1 cdstart = 1; c = p; p = htp.parent; weighti.num = n - start; /二进制码的长度(包含末尾0) hi = (char *)malloc(n - start)*sizeof(char); strcpy(hi, &cdstart);/将二进制字符串拷贝到指针数组h中 free(cd);/释放cd存 system(pause);/*所有字符的编码*/void CrtHuffmanCode

20、(char ch, HuffmanCode h, HuffmanCode hc, WeightNode weight, int n, int m) int i, k; for (i = 0; im; i+) for (k = 1; k = n; k+) /*从weightk.c中查找与chi相等的下标K*/ if (chi = weightk.c) break; hci = (char *)malloc(weightk.num)*sizeof(char); strcpy(hci, hk); /拷贝二进制编码 /*解码*/void TrsHuffmanTree(Huffman ht, WeightNode w, HuffmanCode hc, int n, int m) int i = 0, j, p; while (im) p = 2 * n - 1;/从父亲节点向下遍历直到叶子节点 for (j = 0; hcij != 0; j+) if (hcij = 0) p = htp.LChild; else p = htp.RChild; prin

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

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