哈夫曼编码和译码的设计与实现_第1页
哈夫曼编码和译码的设计与实现_第2页
哈夫曼编码和译码的设计与实现_第3页
哈夫曼编码和译码的设计与实现_第4页
哈夫曼编码和译码的设计与实现_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、算法与数据结构课程设计哈夫曼编码和译码的设计与实现1.问题描述利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼码的编/译码系统。2.基本要求a.编/译码系统应具有以下功能:(1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。(2)E:编码(Encoding)。利用已建好的

2、哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。(4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。(5)T:印哈夫曼树(Tree printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式或广义表)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。b.测

3、试数据(1)利用下面这道题中的数据调试程序。某系统在通信联络中只可能出现八种字符,其概率分别为0.25,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计哈夫曼编码。(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。字符 空格 A B C D E F G H I J K L M频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20字符 N O P Q R S T U V W X Y Z频度 57 63 15 1 48 51 80 23 8

4、18 1 16 1 3需求分析3.1程序的基本功能本程序可以对任何大小的字符型文件进行Huffman编码,生成一个编码文件。并可以在程序运行结束后的任意时间对它解码还原生成字符文件。即:先对一条电文进行输入,并实现Huffman编码,然后对Huffman编码生成的代码串进行译码,最后输出电文数字3.2输入/输出形式当进行编码时输入为原字符文件文件名,当程序运行编码完成之后输入编码文件名(默认名为code.dll)。当进行译码时输入为编码文件名(默认名为code.dll),从文件中读取Huffman编码树后输入字符文件的文件名。3.3测试数据要求本程序中测试数据主要为字符型文件。4概要设计1.系

5、统结构图(功能模块图)哈弗曼树编码译码器编码译码退出2功能模块说明(1).编码:提示要编码的文件文件名读取文件以字母出现次数为权值建立哈弗曼树对文本进行哈弗曼编码并输出编码提示将编码保存的文件名保存编码文件;(2).译码:提示输入要译码的文件名利用建立好的哈弗曼树进行译码将译码输出提示保存译码文件的文件名保存译码文件;(3).退出:退出系统,程序运行结束。5详细设计创建哈弗曼树开始初始化哈夫曼链表且有2n-1个节点i=1Iweight=countip=p-nextfor(i=n;iParent=HT2-Parent=pp-LChild=HT1p-RChild=HT2p-weight=HT1-w

6、eight+HT2-weight结束编码开始将字符存入哈夫曼编码结构体数组的字符单元中if(q=q-Parent-LChild)HCi.code-HCi.start=0HCi.code-HCi.start=1p=p-nextI=n 时结束译码开始Root指向根节点P!=rootcodei=0p=p-LChildp=p-Rchildp-LChild=NULL&p-RChild=NULLsk+=strjp=root结束6调试分析1.从叶子节点开始向上遍历二叉树,获得哈夫曼编码; 2.根据哈夫曼编码遍历哈夫曼树直到叶子节点,获得译码 3.算法的时间复杂度分析:程序部分用双循环嵌套结构,时间复杂度为O

7、(n2). 4算法的空间复杂度分析:算法的空间复杂度为O(n)5. 程序需要反复调试,并且调试过程比较慢,需要有一个比较正确的调试方法,更需要我们有耐心7用户使用说明1.输入字符的个数n 2输入n个字符和n个权值3 选择(15)操作可对huffman树进行编码和译码以及huffman树表的打印4 退出系统8测试结果9附录#include stdio.h#include stdlib.h#include string.h#define MAX 100struct HafNode int weight; int parent; char ch; int lchild; int rchild;*my

8、HaffTree;struct Coding char bitMAX; char ch; int weight;*myHaffCode;void Haffman(int n)/* 构造哈弗曼树 */ int i,j,x1,x2,s1,s2; for (i=n+1;i=2*n-1;i+) s1=s2=10000; x1=x2=0; for (j=1;j=i-1;j+) if(myHaffTreej.parent=0&myHaffTreej.weights1) s2=s1; x2=x1; s1=myHaffTreej.weight; x1=j; else if(myHaffTreej.parent

9、=0&myHaffTreej.weights2) s2=myHaffTreej.weight; x2=j; myHaffTreex1.parent=i; myHaffTreex2.parent=i; myHaffTreei.weight=s1+s2; myHaffTreei.lchild=x1; myHaffTreei.rchild=x2; void HaffmanCode(int n) int start,c,f,i,j,k; char *cd; cd=(char *)malloc(n*sizeof(char); myHaffCode=(struct Coding *)malloc(n+1)

10、*sizeof(struct Coding); cdn-1=0; for(i=1;i=n;+i) start=n-1; for(c=i,f=myHaffTreei.parent;f!=0;c=f,f=myHaffTreef.parent) if(myHaffTreef.lchild=c) cd-start=0; else cd-start=1; for(j=start,k=0;jn;j+) myHaffCodei.bitk=cdj; k+; myHaffCodei.ch=myHaffTreei.ch; myHaffCodei.weight=myHaffTreei.weight; free(cd

11、);void print() printf(*n); printf(* *n); printf(* *n); printf(* welcome to huffman coding and codeprinting *n); printf(* *n); printf(* *n); printf(*1.init 2.coding 3.codeprinting 4.print the huffman 5.exit *n); printf(* *n); printf(*n);Init() int i,n,m; printf(now initn); printf(please input the num

12、ber of words:n); scanf(%d,&n); m=2*n-1; myHaffTree=(struct HafNode *)malloc(sizeof(struct HafNode)*(m+1); for(i=1;i=n;i+) printf(please input the word and the equal:n); scanf(%s%d,&myHaffTreei.ch,&myHaffTreei.weight); myHaffTreei.parent=0; myHaffTreei.lchild=0; myHaffTreei.rchild=0; for(i=n+1;i=m;i+

13、) myHaffTreei.ch =#; myHaffTreei.lchild=0; myHaffTreei.parent=0; myHaffTreei.rchild=0; myHaffTreei.weight=0; Haffman(n); HaffmanCode(n); for(i=1;i=n;i+) printf(%c %d,myHaffCodei.ch,myHaffCodei.weight); printf(n); printf(init success!n); return n;void Caozuo_C(int m)/* 对字符进行编码 */ int n,i,j; char stri

14、ng50,*p; printf(please input the words:n); scanf(%s,string); n=strlen(string); for(i=1,p=string;i=n;i+,p+) for(j=1;j=m;j+) if(myHaffCodej.ch=*p) printf(%sn,myHaffCodej.bit); void Caozuo_D(int n) int i,c; char code1000,*p; printf(please input the coding:n); scanf(%s,code); for(p=code,c=2*n-1;*p!=0;p+

15、) if(*p=0) c=myHaffTreec.lchild; if(myHaffTreec.lchild=0) printf(%c,myHaffTreec.ch); c=2*n-1; continue; else if(*p=1) c=myHaffTreec.rchild; if(myHaffTreec.lchild=0) printf(%c,myHaffTreec.ch); c=2*n-1; continue; printf(n); void Caozuo_T(int n) int i; printf(word equal leftchild rightchild prentsn); for(i=1;i=2*n-1;i+) printf(%c %d %d %d %dn,myHaffTreei.ch,myHaffTreei.weight,myHaffTreei.lchild,myHaffTreei.rchild,myHaffTreei.parent);main() int n; char char1; print(); n=Init(); while(1) pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论