数据结构与算法——电文的编码和译码.doc

数据结构与算法——电文的编码和译码.doc

ID:49691604

大小:51.95 KB

页数:8页

时间:2020-03-03

数据结构与算法——电文的编码和译码.doc_第1页
数据结构与算法——电文的编码和译码.doc_第2页
数据结构与算法——电文的编码和译码.doc_第3页
数据结构与算法——电文的编码和译码.doc_第4页
数据结构与算法——电文的编码和译码.doc_第5页
资源描述:

《数据结构与算法——电文的编码和译码.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、电文的编码和译码1.问题描述从键盘接受一串电文字符,输出对应的哈夫曼编码;同时能翻译由哈夫曼编码生成的代码串,输出对应的电文字符串。2.设计要求(1)构造一棵哈夫曼树。(2)实现哈夫曼编码,并用哈夫曼编码生成的代码进行译码。(3)程序中字符和权值是可变的,实现程序的灵活性。3.数据结构本课程设计采用结构体数组作为数据结构,来储存哈夫曼树及其编码。4.分析与实现在电报通信中,电文是以二进制代码传送的。在发送时,需要将电文中的字符转换成二进制代码串,即编码;在接收时,要将收到的二进制代码串转化成对应的字符序列,即译码。字符被使用的频率是非均匀的。在传送电文时,要想使电文总长尽可能短,就需要让使用频

2、率高的字符编码长度尽可能短。因此,若对某字符集进行不定长编码设计,则要求任一一个字符编码都不能使其他字符编码的前缀,这种编码称作前缀编码。由哈弗曼树求得的编码是最优前缀码,也称哈夫曼编码。给出字符集和各个字符的概率分布,构造哈弗曼树,将哈夫曼树中每个分支结点的左分支标0,右分支标1,从根到每个叶子的路径上的标号连起来就是给叶子所代表字符的编码。(1)构造哈夫曼树根据哈弗曼算法,若已知n个叶结点,则构造的哈弗曼树有2n-1个结点。第一步:先输入字符集中的n个字符(叶结点)和表示其概率分布的权值,储存在ht(HuffNode型)数组的前n个数组元素中。然后将2n-1个结点的双亲和孩子结点均置为0。

3、第二步:在所有的结点中,选取双亲为零且具有最小权值m1和次小权值m2的两个结点,用p1和p2指示这两个结点在数组中的位置。将根为ht[p1]和ht[p2]的两棵树合并,使其成为新结点ht[i]的左右孩子,ht[i]的权值为最小权值m1和次小权值m2之和;ht[p1]和ht[p2]的双亲指向i。共进行n-1次合并,产生n-1个结点,依次放入ht数组中数组下标从n+1到2n-1。这样就构成了一棵哈夫曼树。(1)编码基本思想是:从哈弗曼树的叶结点ht[i](1≤i≤n)出发,通过双亲parent找到其双亲ht[f],通过ht[f]的域left和right,可知ht[i]是ht[f]的左分支还是右分支

4、,若是左分支,生成的代码0;若是右分支,生成代码1。代码存放在数组cd的下标start中,然后把ht[f]作为出发点,重复上述过程,直到找到根为止。显然这样生成的代码序列与要求的编码次序相反,为了得到正确的代码,把最先生成的代码存放在数组的第n个(虽然各个字符的编码长度不一,但都不会超过n个)位置处,再次生成的代码存放在数组的第n-1个位置处,以此类推。用变量start来指示编码在数组cd中的起始位置,start的初始值为n,生成一个代码后,start的值就减1。(2)译码基本思想是:首先输入二进制代码串,存放在数组ch中,以#为结束标志;接下来,将代码与编码表比较,如果为0,转向左子树,如果

5、为1,转向右子树,直到叶结点结束,此时输出叶结点的数据域,即所对应的字符;继续译码,直到代码串结束。5.源代码#include#include#include#defineMAXSIZE50typedefcharDataType;typedefstruct//哈夫曼树结点的结构{DataTypedata;//数据用字符表示intweight;//权值intparent;//双亲intlchild,rchild;//左右孩子}HuffNode;typedefstruct//哈夫曼编码的存储结构{DataTypecd[MAXSIZE];//

6、存放编码位串intstart;//编码的起始位置}HuffCode;voidHuffmanCreate(HuffNode*ht,intn){inti,j,p1,p2,m1,m2;for(i=1;i<=n;i++){getchar();//接收回车printf("第%d个字符及其权重分别为(用空格分隔):",i);scanf("%c%d",&ht[i].data,&ht[i].weight);}for(i=1;i<=2*n-1;i++)//对数组初始化ht[i].parent=ht[i].lchild=ht[i].rchild=0;for(i=n+1;i<=2*n-1;i++){m1=m2=

7、32767;//令m1、m2为整数最大值p1=p2=1;for(j=1;j

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。