收藏 分享(赏)

信息论课程设计报告.doc

上传人:精品资料 文档编号:8782808 上传时间:2019-07-11 格式:DOC 页数:35 大小:110.34KB
下载 相关 举报
信息论课程设计报告.doc_第1页
第1页 / 共35页
信息论课程设计报告.doc_第2页
第2页 / 共35页
信息论课程设计报告.doc_第3页
第3页 / 共35页
信息论课程设计报告.doc_第4页
第4页 / 共35页
信息论课程设计报告.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

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

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

3、参考算法伪代码:For all do ,ijWCif 是 的前缀 thenij将相应的后缀作为一个尾随后缀放入集合 中0FEnd ifEnd forLoopFor all do iWCFor all dojnFif 是 的前缀 thenij将相应的后缀作为一个尾随后缀放入集合 中1nFElse if 是 的前缀 thenjWi将相应的后缀作为一个尾随后缀放入集合 中1nEnd ifEnd for End for iFIf then,iiWCReturn falseElse if F 中未出现新的元素 thenReturn trueEnd if/能走到这里,说明 F 中有新的元素出现,需继续En

4、d loop3. 实现源码#include#include#include#includeusing 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 = 0if (ci = 0) /d 比 c 长,将 d 的尾随后缀放入 f

5、中 for (j = i; dj != 0; j+)fsumj - i = dj;fsumj - i = 0;for (k = 0; k=p2=p3=.=pq(2)用 0 和 1 码符号分别分配给概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个信服好,并用这两个最小概率之和作为新符号的概率,从而得到只包含 q-1 个服啊后的新信源,称为S 信源的缩减信源 S1。(3)把缩减信源 S1 的符号仍按概率大小以递减次序排列,再将其最后两个概率最小的符号合并成一个新符号,并分别用 0 和 1 码符号表示,这样又形成了 q-2 个符号的缩减信源 S2。(4)依次继续下去,直至缩减信源最后只

6、剩两个符号为止。将这最后两个符号分别用 0 和 1 码符号表示。最后这两个符号的概率之和必为1。然后从最后一级缩减信源开始,依编码路径由后向前返回,就得出各信源符号所对应的码符号序列,即得对应的码字。Huffman 码参考算法伪代码:if q=2 thenReturn 01,sElse降序排序 ip缩减信源:创建一个符号 以取代 ,其概率s12,qs21qp递归调用 Huffman 算法以得到 的编码 (相应的概率013,.,q013,.,qw分布为 )013,.,qppReturn 013321,.,0,qqqswsssEnd if3. 实现源码#include #include #incl

7、ude #include #include #pragma warning(disable:4996)#define N 100#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

8、 != 0; i+)if (ai = ai + 1)jishu+;elseycj + 1 = jishu + 48;j = j + 2;ycj = ai + 1;jishu = 1;ycj = 0;cout htj.weight ? j : s1;hts1.parent = i;hti.LChild = s1;for (j = 1; j htj.weight ? j : s2;hts2.parent = i;hti.RChild = s2;hti.weight = hts1.weight + hts2.weight;/权值累加/*叶子结点的编码 */void CrtHuffmanNodeCod

9、e(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;/末尾置 0for (i = 1; i #include#pragma warning(disable:4996)using namespace std;#include“math.h“char S100, A10; /用户的码字、保存输入字符float P10, f10, gFs; /字符概率char bm

10、100, jm100;fstream in(“in3.txt“);fstream out(“out3.txt“);/编码程序void bianma(int a, int h)int i, j;float fr;float ps = 1;float Fs = 0;float Sp100; /以待编码的个数和字符个数为循环周期 将待编码的字符所对应的概率存入到 Fs 中for (i = 0; i(int)l)l = (int)l + 1;else l = int(l);/将 Fs 转换成二进制的形式int d20;int m = 0;while (lm)Fs = 2 * Fs;if (Fs1)Fs = Fs - 1;dm = 1;else if (Fs= l)while (1)dm - 1 = (dm - 1 + 1) % 2;/最后位加if (dm - 1 = 1)break;else m-;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报