logo资料库

赫哈曼编码的应用对输入的一串字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串.doc

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
数据结构课程设计报告 赫哈曼编码的应用 课 姓 学 题: 名: 号: 专业班级: 指导教师: 孙叶枫 设计时间: 评阅意见: 评定成绩: 指导老师签名: 年 月 日 1
目 录 一、需求分析………………………………………3 二、设计原理与概要………………………………4 三、程序流程图…………………………………....6 四、程序源代码……………………………………8 五、运行结果与验证...............................................14 六、设计总结……………………………………....16 七、参考文献………………………………………17 2
第一部分 需求分析 本设计要求是对输入的一串字符实现赫夫曼编码,再对赫夫曼编码生成的代 码串进行译码,输出电文字符串。 在当今信息爆炸的时代,如何采用有效的数据压缩技术节省数据文件的存储 空间和计算机网络的传送时间已越来越引起人们的重视,赫夫曼编码正是一种应 用广泛且非常有效的数据压缩技术。 赫夫曼编码的应用很广泛,如在音乐、电影、摄影、通信等领域都有它应用 的身影,存储、分析、加工、处理是它们制作的第二阶段,怎样使制作出来的作 品质量最好、体积最少,是关系产品受到青睐的原因之一。体积的大小也就是它 所占据存储空间,在保证文件质量最好,又有效的节省存储空间,需要用最好的 压缩存储解码算法,而赫夫曼编码是一种将信息转换成二进制编码有效的方法之 一,赫夫曼编码是利用赫夫曼树求得的用于通信的二进制编码。而这次我们的课 程设计对编码译码的要求不是太高,只是将大写字母或小写字母转化成二进制编 码,或将二进编码转化成大写字母或小写字母,虽然功能有一点局限,但也是一 次成功的尝试,能满足一般的需求。 根据设计要求和分析,要实现本设计,必须实现以下几个方面的功能: (1) 赫夫曼树的建立; (2) 赫夫曼的编码生成; (1) 编码文件的译码; 3
二 设计原理与概要 树中从根到每个叶子都有一条路径,对路径上的个分支约定:指向左子树的 分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1” 的序列作为和各个叶子对应的字符编码,这就是赫夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程就是解码。电报通信是 传递文字的二进制形式的字符串。但在信息传递时,总希望长度尽可能短,即采 用最短码。假设每种字符在电文中出现的次数为 Wi,编码的长度为 Li,电文中 有 n 种字符,则电文编码的总长度为ΣWiLi,若将此对应到二叉树上,Wi 为叶结 点的权,Li 为根结点到叶结点的路径长度。那么,ΣwiLi 恰好为二叉树上带权 路径的长度。 #define n 100 #define m 2*n-1 typedef struct { char ch; char bits[9]; int len; }CodeNode; //叶子结点数 //赫夫曼树中结点总数 //存放编码位串 //编码长度 typedef CodeNode HuffmanCode[n+1]; typedef struct { int weight; //权值 int lchild,rchild,parent; //左右孩子及双亲指针 }HTNode; //树中结点类型 typedef HTNode HuffmanTree[m+1]; //0 号单元不用 4
定义各种变量 输入需要编码的字符串(为大写或小写) 统计字符的种类及各种字符出现的频率 建立赫夫曼树 生成赫夫曼编码 建立各种字符的赫夫曼编码及编码文件 从文件中读编码文件译码 输出译码后的字符串 总流程 图(1) 5
建立正文的编码文件的流图 Int i,j; FILE b*fp; 真 For i=1 to num *str 假 真 假 HC[i].ch==*str For j=0 to HC[i].len Fputc(HC[i].bits[j],fp) j++ break++ str++ for i=1 to num 输出 HC[i].ch 和 HC[i].bits i++ fclose(fp) 图 (2) 6
代码文件的译码: FILE *fp, char str[254]; char *p; static char cd[n+1]; int i, j, k=0, cjs fp=fopen(“codefile.txt”,”r”) feof (fp) 假 真 Cjs=0 For i=0 to i
四、部分程序源代码 //(1)类型及相关变量定义(type6.h) #include #include #define n 100 #define m 2*n-1 typedef struct { //叶子结点数 //赫夫曼树中结点总数 char ch; char bits[9]; int len; //存放编码位串 //编码长度 }CodeNode; typedef CodeNode HuffmanCode[n+1]; typedef struct { int weight; //权值 int lchild,rchild,parent; //左右孩子及双亲指针 }HTNode; //树中结点类型 typedef HTNode HuffmanTree[m+1]; int num; //0 号单元不用 //建立赫夫曼树 void ChuffmanTree(HuffmanTree HT,HuffmanCode HC,int cnt[],char str[]) { int i,s1,s2; for(i=1;i<=2*num-1;i++) { HT[i].lchild=0;HT[i].rchild=0; HT[i].parent=0;HT[i].weight=0; //初始化 HT } 8
分享到:
收藏