1、信息论与编码实验报告学院: 计算机与通信工程学院专业: 计算机科学与技术班级: 计 1203 班学号:姓名:2014 年 12 月 29 日实验一 唯一可译码判别准则实验目的:1.进一步熟悉唯一可译码判别准则;2.掌握 C 语言字符串处理程序的设计和调试技术。实验内容:1.已知:信源符号数和码字集合 C;2.输入:任意的一个码,码字的个数和每个具体的码字在运行时从键盘输入;3.输出:判决(是唯一可译码/不是唯一可译码);循环(若继续判决则输入 1 循环判决,否则输入 0 结束运行)。实验原理:根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。 算
2、法:1、考察 C 中所有的码字,若 Wi 是 Wj 的前缀,则将对应的后缀作为一个尾随后缀码放入集合 Fi+1 中;2、考察 C 和 Fi 俩个集合,若 Wi C 是 WjF 的前缀或 Wi F 是 WjC 的前缀,则将相应的后缀作为尾随后缀码放入集合 Fi+1 中;3、F=Fi 即为码 C 的尾随后缀集合;4、若 F 中出现了 C 中的元素,算法终止,返回假(C 不是唯一可译码);否则若 F中没有出现新的元素,则返回真。实验环境及实验文件存档名:1.实验环境:visual C+ 6.0 2.文件名 :weiyikeyi.cpp实验结果及分析:1.源代码:#include #include c
3、har 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 中 for(j=i;dj!=0;j+) fsumj-i=dj; fsumj-i=0; for(k=0;k100) printf(“输入码字个数过大,请输入小于 100 的数n“); printf(“请输入码字的个数:“); s
4、canf(“%d“, flag=0; printf(“请分别输入码字:n“); for(i=0;i#define N 50 #define maxval 10000.0#define maxsize 100 typedef structchar ch;float weight;int lchild,rchild,parent;hufmtree;typedef structchar bitsN; /位串int start; /编码在位串中的起始位置char ch; /字符codetype;void huffman(hufmtree tree);/建立哈夫曼树void huffmancode(co
5、detype code,hufmtree tree);/根据哈夫曼树求出哈夫曼编码int n;int m;void main() printf(“输入信源符号个数n“);scanf(“%d“,getchar();m = 2*n-1;printf(“ *霍夫曼哈夫曼编码*n“);printf(“总共有%d 个字符n“,n);hufmtree tree2*N-1;codetype codeN;int i,j;/循环变量huffman(tree);/建立哈夫曼树huffmancode(code,tree);/根据哈夫曼树求出哈夫曼编码printf(“输出每个字符的哈夫曼编码n“);for(i=0;i
6、n;i+)printf(“%c: “,codei.ch);for(j=codei.start;jn;j+)printf(“%c “,codei.bitsj);printf(“n“);void huffman(hufmtree tree)/建立哈夫曼树int i,j,p1,p2;/p1,p2 分别记住每次合并时权值最小和次小的两个根结点的下标float small1,small2,f;char c;for(i=0;im;i+) /初始化treei.parent=0;treei.lchild=-1;treei.rchild=-1;treei.weight=0.0;printf(“依次读入前%d 个
7、结点的字符及权值( 中间用空格隔开)n“,n);for(i=0;in;i+) /读入前 n 个结点的字符及权值printf(“输入第%d 个字符为和权值“,i+1);scanf(“%c %f“,getchar();treei.ch=c;treei.weight=f;for(i=n;im;i+) /进行 n-1 次合并,产生 n-1 个新结点p1=0;p2=0;small1=maxval;small2=maxval; /maxval 是 float 类型的最大值for(j=0;ji;j+) /选出两个权值最小的根结点if(treej.parent=0)if(treej.weightsmall1)
8、small2=small1; /改变最小权、次小权及对应的位置small1=treej.weight;p2=p1;p1=j;elseif(treej.weightsmall2)small2=treej.weight; /改变次小权及位置p2=j;treep1.parent=i;treep2.parent=i;treei.lchild=p1; /最小权根结点是新结点的左孩子treei.rchild=p2; /次小权根结点是新结点的右孩子treei.weight=treep1.weight+treep2.weight;/huffmanvoid huffmancode(codetype code,h
9、ufmtree tree)/根据哈夫曼树求出哈夫曼编码/codetype code为求出的哈夫曼编码/hufmtree tree为已知的哈夫曼树int i,c,p;codetype cd; /缓冲变量for(i=0;in;i+)cd.start=n;cd.ch=treei.ch;c=i; /从叶结点出发向上回溯p=treei.parent; /treep是 treei的双亲while(p!=0)cd.start-;if(treep.lchild=c)cd.bitscd.start=0; /treei是左子树,生成代码0elsecd.bitscd.start=1; /treei是右子树,生成代码1c=p;p=treep.parent;codei=cd; /第 i+1 个字符的编码存入 codei2.运行结果