《数据结构课程设计:电文编码译码通信电子WCDMA技术_高等教育-大学课件.pdf》由会员分享,可在线阅读,更多相关《数据结构课程设计:电文编码译码通信电子WCDMA技术_高等教育-大学课件.pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、xx 农林大学 计算机与信息学院 数据结构课程设计 设计:xx 编译码器 姓名:xx 专业:2013 级计算机科学与技术 学号:班级:完成日期:2013.12.28 xx 编译码器 一、需求分析 在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储 空间和计算机网络的传送时间已越来越引起人们的重视,哈夫曼编码正是一种 应用广泛且非常有效的数据压缩技术。哈夫曼编码是一种编码方式,以哈夫曼 树即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。哈夫 曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编 码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概
2、率而建 立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长 的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数 据的目的)。哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进 制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分 支约定:指向左子树的分支表示“0码”,指向右子树的分支表示“1码”,取每条路径上 的“0或”“1的”序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码。哈夫 曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成 字符串。二、设计要求 对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的 代
3、码串进行译码,输出电文字符串。通常我们把数据压缩的过程称为编 码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度能尽可能短,即采用最短码。假设每种字符在 电文中出现的次数为 Wi,编码长度为Li,电文中有n种字符,则电文编码总长 度为刀WiL。若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的 路径长度。那么,刀WiL恰好为二叉树上带权路径长度。因此,设计电文总长最 短的二进制前缀编码,就是以 n 种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。设计实现的功能:(1)xx 树的建立;(2)xx编码的生成;(3)编码文件
4、的译码。三、概要设计 哈夫曼编 译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树 生成哈夫曼编码后进行译码。在数据通信中,经常需要将传送的文字转换成由二进制字符 0、1 组成的二进制串,称之为编码。构造一棵哈夫曼树,规定哈夫曼树中 的左分之代表 0,右分支代表 1,则从根节点到每个叶子节点所经过的路径分支 组成的 0 和 1 的序列便为该节点对应字符的编码,称之为哈夫曼编码。最简单的二进制编码方式是等长编码。若采用不等长编码,让出现频率高 的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短 传送电文的总长度。哈夫曼树课用于构造使电文的编码总长最短的编码方案。设计包含的
5、几个方面:xx 树的建立 赫夫曼树的建立由赫夫曼算法的定义可知,初始森林中共有 n 棵只含有根 结点的二码码器一需求分器一析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建
6、?引信?今估译建?送?网爆?泛?信?的需?今估译建叉树。算法的第二 步是:将当前森林中的两棵根结点权值最小的二叉树,合并成一棵新的二叉树;每合并一次,森林中就减少一棵树,产生一个新结点。显然要进行 n1 次合 并,所以共产生 n1 个新结点,它们都是具有两个孩子的分支结点。由此可 知,最终求得的哈夫曼树中一共有 2n-1个结点,其中n个结点是初始森林的 n 个孤立结点。并且哈夫曼树中没有度数为 1 的分支结点。我们可以利用一个大 小为 2n-1 的一维数组来存储赫夫曼树中的结点。定义的结构体类型如下:typedef struct char data;/结点字符 int weight;/权值 i
7、nt parent;/双亲结点 int lchild;/左孩子结点 int rchild;/右孩子结点 HTNode;xx 编码 要求电文的哈夫曼编码,必须先定义哈夫曼编码类型,根据设计要求和实 际需要定义的类型如下:typedet struct char cdN;/存放编码的数组 int start;/从start开始读cd中的哈夫曼编码 Hcode;/编码结构体类型 代码文件的译码 译码的基本思想是:读文件中编码,并与原先生成的哈夫曼编码表比较,遇到相等时,即取出 其对应的字符存入一个新串中。码码器一需求分器一析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空
8、间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建四、详细设计 字符统计 char*p;int i,j,k;for(i=1;i=256;i+)for(p=s;*p!=0;p+)k=*p;for(i=1,
9、j=0;i=256;i+)htl.data=stroutput;/按字母顺序将出现的字母依次存入数组 ht l+;int i,k,lnode,rnode;int min1,min2;for(i=0;i2*n-1;i+)hti.parent=hti.lchild=hti.rchild=0;/所有结点的相关域置初值 0 for(i=n;i2*n-1;i+)/构造哈夫曼树 min1=min2=MAX;/int 的范围是-32768-32767 lnode=rnode=0;/lnode 和 rnode 记录最小权值的两个结点位置 for(k=0;k=i-1;k+)/选出每次外层循环最小权值的两个结点
10、if(htk.parent=0)/只在尚未构造二叉树的结点中查找 if(htk.weightmin1)/比 min1 小时 min2=min1;rnode=lnode;min1=htk.weight;lnode=k;else if(htk.weightmin2)/比 min1 大,比 min2 小 min2=htk.weight;rnode=k;htlnode.parent=i;htrnode.parent=i;/两个最小 节点的父节点是 i hti.weight=htlnode.weight+htrnode.weight;/两个最小节点 的父节点权值为两个最小节点权值之和 码码器一需求分器一
11、析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建hti.lchild=lnode;hti.rchild=rnode;/父
12、节点的左节点和右节点 哈夫曼编 码 void CreateHCode(HTNode ht,HCode hcd,int n)int i,p,c;HCode hc;for(i=0;in;i+)/根据哈夫曼树求哈夫曼编码 hc.start=n;/初始位置 c=i;/从叶子结点 hti 开始上溯 p=hti.parent;while(p!=0)/循序直到树根结点结束循环 hc.cdhc.start-=(htp.lchild)=c?0:1;/左孩子记为 0,右孩子记为 1 c=p;p=htp.parent;/与上句 c=i;p=hti.parent 同义,促进循环 hc.start+;/start指向哈
13、夫曼编码hc.cd中最开始字符hcdi=hc;xx 译码 void deHCode(HTNode ht,HCode hcd,int n,char str)译码函数printf(”输出 译码结果为:n);int i,j,k,x,m=0;char codeMAX;for(i=0;iMAX;i+)for(j=0;jn;j+)if(stri=htj.data)/循环查找与输入字符相同的编号,相同的就输出这个字 符的编码 for(k=hcdj.start;k=n;k+)codem=hcdj.cdk;/将输出的编码赋值到 数组中 m+;break;/输出完成后跳出当前 for 循环 codem=#;码码器
14、一需求分器一析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建/把要进行译码的字符串存入 code 数组中 while(c
15、ode0!=#)for(i=0;in;i+)m=0;/m 为想同编码个数的计数器 for(k=hcdi.start,j=0;k=n;k+,j+)/j 为记录所存储这个字符的编码个数 if(codej=hcdi.cdk)/当有相同编码时 m 值加 1 m+;if(m=j)当输入的字符串与所存储的编码字符串个数相等时则输出这 个的 data 数据printf(%c,hti.data);for(x=0;codex-j!二#;x+)把 已 经 使 用 过 的code数 组 里 的 字 符 串 删 除 codex=codex+j;/删除 j 个数,往前移动 j 位 n);主函数 void main()c
16、har stMAX,sstMAX;int n,i;printf(请输入字符串(任意字符):n);gets(st);/99 for(i=0;i99;i+)ssti=sti;/HTNode htM;HCode hcdN;CreateHCode(ht,hcd,n);outputHCode(ht,hcd,n);editHCode(ht,hcd,n,sst);deHCode(ht,hcd,n,sst);五、调试 输出 xx 编码 输出编码结果 输出译码结果 附录 源程序#include#include/gets()函数需要#define N 256/义用 N 表示 50叶节点数 码码器一需求分器一析在当
17、今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建#define M 2*N-1/用 M 表示节点总数当叶节点数位 n 时总节点
18、数为 2n-1#define MAX 32767 typedef struct char data;/结点字符 int weight;/权值 int parent;/双亲结点 int lchild;/左孩子结点 int rchild;/右孩子结点 HTNode;/typedef struct char cdN;/存放哈夫曼码 int start;/从 start 开始读 cd 中的哈夫曼码 HCode;/char*p;int i,j,k;for(i=1;i=256;i+)for(p=s;*p!=0;p+)k=*p;for(i=1,j=0;i=256;i+)htl.data=stroutput;
19、/按字母顺序将出现的字母依次存入数组 ht l+;int i,k,lnode,rnode;int min1,min2;for(i=0;i2*n-1;i+)码码器一需求分器一析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?
20、成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建hti.parent=hti.lchild=hti.rchild=0;/所有结点的相关域置初值 0 for(i=n;i2*n-1;i+)/构造哈夫曼树 min1=min2=MAX;/int 的范围是-32768-32767 lnode=rnode=0;/lnode 和 rnode 记录最小权值的两个结点位置 for(k=0;k=i-1;k+)/选出每次外层循环最小权值的两个结点 if(htk.parent=0)/只在尚未构造二叉树的结点中查找 if(htk.weightmin1)/比 min1
21、小时 min2=min1;rnode=lnode;min1=htk.weight;lnode=k;else if(htk.weightmin2)/比 min1 大,比 min2 小 min2=htk.weight;rnode=k;htlnode.parent=i;htrnode.parent=i;/两个最小 节点的父节点是 i hti.weight=htlnode.weight+htrnode.weight;/两个最小节点 的父节点权值为两个最小节点权值之和 hti.lchild=lnode;hti.rchild=rnode;/父节点的左节点和右节 点/void CreateHCode(HTN
22、ode ht,HCode hcd,int n)int i,p,c;HCode hc;for(i=0;in;i+)/根据哈夫曼树求哈夫曼编码 hc.start=n;/初始位置 c=i;/从叶子结点 hti 开始上溯 p=hti.parent;while(p!=0)/循序直到树根结点结束循环 hc.cdhc.start-=(htp.lchild)=c?0:1;/左孩子记为 0,右孩子记为 1 c=p;p=htp.parent;/与上句 c=i;p=hti.parent 同义,促进循环 码码器一需求分器一析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信
23、络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建hc.start+;/start指向哈夫曼编码hc.cd中最开始字符hcdi=hc;/void outputHCode(HTNode ht,HCode hcd,int
24、n)/输出哈夫曼编码的列表int i,k;printf(输出 xx 编码:n);for(i=0;in;i+)输出 data 中的所有数据,printf(%c:t,hti.data);for(k=hcdi.start;k=n;k+)/输出所有 data 中数据的编码 printf(%c,hcdi.cdk);/从初最开始的字符起输出 printf(n);/void editHCode(HTNode ht,HCode hcd,i nt n,char str)/编码函数 int i,j,k;printf(n 输出编码结果:n);for(i=0;iMAX;i+)for(j=0;jn;j+)if(stri
25、=htj.data)/循环查找与输入字符相同的编号,相同的就输出这个字 符的编码 for(k=hcdj.start;k=n;k+)printf(%c,hcdj.cdk);break;/输出完成后 跳出当前 for 循环 printf(n);/void deHCode(HTNode ht,HCode hcd,int n,char str)译码函数printf(”输出 码码器一需求分器一析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它
26、根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建译码结果为:n);int i,j,k,x,m=0;char codeMAX;for(i=0;iMAX;i+)for(j=0;jn;j+)if(stri=htj.data)/循环查找与输入字符相同的编号,相同的就输出这个字 符的编码 for(k=hcdj.start;k=n;k+)cod
27、em=hcdj.cdk;/将输出的编码赋值到 数组中 m+;break;/输出完成后跳出当前 for 循环 codem=#;/把要进行译码的字符串存入 code 数组中 while(code0!=#)for(i=0;in;i+)m=0;/m 为想同编码个数的计数器 for(k=hcdi.start,j=0;k=n;k+,j+)/j 为记录所存储这个字符的编码个数 if(codej=hcdi.cdk)/当有相同编码时 m 值加 1 m+;if(m=j)/当输入的字符串与所存储的编码字符串个数相等时则输出这 个的 data 数据 printf(%c,hti.data);for(x=0;codex-
28、j!=#;x+)/把已经使用过的 code 数组里的字符串删除 codex=codex+j;/删除 j 个数,往前移动 j 位 printf(n);/void main()char stMAX,sstMAX;int n,i;printf(请输入字符串(任意字符):码码器一需求分器一析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较
29、各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建n);gets(st);/99 for(i=0;i99;i+)ssti=sti;/HTNode htM;HCode hcdN;CreateHCode(ht,hcd,n);outputHCode(ht,hcd,n);editHCode(ht,hcd,n,sst);deHCode(ht,hcd,n,sst);码码器一需求分器一析在当今信息爆炸时代如何采器一析在当今用爆有效的需数据压缩器技术节省文件存采储空间和分计算机网信络传送信已越来引信起人们重间信视哈夫夫曼术编正正信是种应时求广泛且非常方式常以例某中符常号进信行这符张表特殊之计处于它根信每源符字出现估概率而建立储高高编使较短信间反编低则建长便后串平均期望度降从到叶子泛都条爆路径对信上较各支约编低则建定指向信左树示右到叶子泛非取使或信序列作反列为编低则建就译析输入可间把器采非析成建用二制?间信?成建采二?信?成建?信?成建?非?需信算?今估译建?引信?今估译建?送?网爆?泛?信?的需?今估译建