1、信息论实验报告信息论实验报告计通学院实验一:唯一可译码判别准则1、实验目的:1 进一步熟悉唯一可译码判别准则;2 掌握C语言字符串处理程序的设计和调试技术。2、实验原理:已知:信源符号个数r、码字集合C用下列步骤判断是否为唯一可译码:考察C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀码放入集合F0中;考察C和Fi两个集合,若WiC是WjFi的前缀或者WjFi是WiC的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中;F=UiFi即为码C的尾随后缀集合;若F中出现了C中的元素,则算法终止,返回假(C不是唯一可译码);否则,若F中没有出现新的元素,则返回真。 3、实验环境:
2、windows;visual basic 6.0;4、实验代码:存档名:diyici#include #include #include struct strings char *string; struct strings *next;struct strings Fstr, *Fh, *FP;/输出当前集合void outputstr(strings *str) do coutstringnext; while(str); coutb?b:a; inline int MAX(int a, int b) return ab?a:b;#define length_a (strlen(CP)#d
3、efine length_b (strlen(tempPtr)/判断一个码是否在一个码集合中,在则返回0,不在返回1int comparing(strings *st_string,char *code) while(st_string-next) st_string=st_string-next; if(!strcmp(st_string-string,code) return 0; return 1;/判断两个码字是否一个是另一个的前缀,如果是则生成后缀码void houzhui(char *CP,char *tempPtr) if (!strcmp(CP,tempPtr) cout集合C
4、和集合F中有相同码字:endl CPendl 不是唯一可译码码组!next=NULL; cp_temp-string=new charabs(length_a-length_b)+1; char *longstr; longstr=(length_alength_b ? CP : tempPtr);/将长度长的码赋给longstr /取出后缀 for (int k=MIN(length_a,length_b); kstringk - MIN(length_a,length_b)=longstrk; cp_temp-stringabs(length_a-length_b)=NULL; /判断新生
5、成的后缀码是否已在集合F里,不在则加入F集合 if(comparing(Fh,cp_temp-string) FP-next=cp_temp; FP=FP-next; void main()/功能提示和程序初始化准备 struct strings Cstr, *Ch, *CP,*tempPtr; Ch=&Cstr; CP=Ch; Fh=&Fstr; FP=Fh; char c=C :; Ch-string=new charstrlen(c); strcpy(Ch-string, c); Ch-next=NULL; char f=F :; Fh-string=new charstrlen(f);
6、 strcpy(Fh-string, f); Fh-next=NULL; /输入待检测码的个数 int Cnum; coutCnum; cout输入待检测码endl; for(int i=0; iCnum; i+) couti+1tempstr; CP-next=new (struct strings); CP=CP-next; CP-string=new charstrlen(tempstr) ; strcpy(CP-string, tempstr); CP-next = NULL; outputstr(Ch); CP=Ch; while(CP-next-next) CP=CP-next;
7、tempPtr=CP; do tempPtr=tempPtr-next; houzhui(CP-string,tempPtr-string); while(tempPtr-next); outputstr(Fh); struct strings *Fbegin,*Fend; Fend=Fh; while(1) if(Fend = FP) cout这是唯一可译码码组next) CP=CP-next; tempPtr=Fbegin; for(;) tempPtr=tempPtr-next; houzhui(CP-string,tempPtr-string); if(tempPtr = Fend)
8、break; outputstr(Fh);/输出F集合中全部元素 5、实验结果及分析:程序基本上满足要求。实验二:Huffman编码1、 实验目的:(1) 进一步熟悉Huffman编码过程;(2)掌握C语言递归程序的设计和调试技术。2、 实验内容:(1)输入:信源符号个数r、信源的概率分布P;(2)输出:每个信源符号对应的Huffman编码的码字。3、实验原理: 霍夫曼码是用概率匹配方法进行信源编码。有两个明显特点:一是保证了概率大的符号对应于短码,概率小的对应于长码,充分利用了短码;二是缩减信源的最后二个码字总是最后一位不同,从而保证了霍夫曼码是即时码。霍夫曼变长码的效率很高,它可以单个信源
9、符号编码或用L较小的信源序列编码,对编码器的设计来说也易实现。4、实验代码及实验文件存档名:实验环境:Windows,Microsoft visual C+文件存档名:dierci代码如下:#include ;#include ;#include ;#include ;typedef struct /构建结构体函数 unsigned int weight; unsigned int parent,lchild,rchild; HTNode,*HuffmanTree;typedef char *HuffmanCode;typedef struct unsigned int s1; /变量名 un
10、signed int s2; MinCode;void Error(char *message);HuffmanCode HuffmanCoding(HuffmanTree HT,HuffmanCode HC,unsigned int *w,unsigned int n);MinCode Select(HuffmanTree HT,unsigned int n); /哈弗曼树函数void Error(char *message)system(CLS); fprintf(stderr,Error:%sn,message); exit(1);HuffmanCode HuffmanCoding(Hu
11、ffmanTree HT,HuffmanCode HC,unsigned int *w,unsigned int n) /利用霍夫曼树来实现编码函数 unsigned int i,s1=0,s2=0; HuffmanTree p; char *cd; unsigned int f,c,start,m; MinCode min; if(n=1) Error(Code too small!); m=2*n-1; HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); for(p=HT,i=0;iweight=*w; p-parent=0; p-lchild=0; p
12、-rchild=0; for(;iweight=0; p-parent=0; p-lchild=0; p-rchild=0; for(i=n+1;i=m;i+) min=Select(HT,i-1); s1=min.s1; s2=min.s2; HTs1.parent=i; HTs2.parent=i; HTi.lchild=s1; HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; printf(HT List:n); for(i=1;i=m;i+) HC=(HuffmanCode)malloc(n+1)*sizeof(char *); cd
13、=(char *)malloc(n*sizeof(char *); cdn-1=0; for(i=1;i=n;i+) start=n-1; for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) if(HTf.lchild=c) cd-start=0; else cd-start=1; HCi=(char *)malloc(n-start)*sizeof(char *); strcpy(HCi,&cdstart); free(cd); return HC;MinCode Select(HuffmanTree HT,unsigned int n) /构建紧致码 u
14、nsigned int min,secmin; unsigned int temp; unsigned int i,s1,s2,tempi; /变量定义 MinCode code; s1=1;s2=1; for(i=1;i=n;i+) if(HTi.parent=0) min=HTi.weight; s1=i; break; tempi=i+; for(;i=n;i+) if(HTi.weightmin&HTi.parent=0) min=HTi.weight; s1=i; for(i=tempi;i=n;i+) if(HTi.parent=0&i!=s1) secmin=HTi.weight
15、; s2=i; break; for(i=1;i=n;i+) if(HTi.weights2) temp=s1; s1=s2; s2=temp; code.s1=s1; code.s2=s2; return code;void main() /主函数体 HuffmanTree HT=NULL; HuffmanCode HC=NULL; unsigned int *w=NULL; unsigned int i,n; system(CLS); printf(输入变量的个数:n); scanf(%d,&n); w=(unsigned int *)malloc(n+1)*sizeof(unsigned int *); w0=0; printf(输入相应概率对应的权值(即LOG值,底数为2),以回车键结束:n); for(i=1;i=n;i+) printf(w%d=,i); scanf(%d,&wi); HC=HuffmanCoding(HT,HC,w,n);for(i=1;i=n;i+) printf(%dtt%dtt%sn,i,wi,HCi);5、 实验结果及分析:实验截图:分析:程序基本满足要求,通过数据结构学过的huffman树,利用权值构造了紧致码。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1