哈夫曼编译码器数据结构课程设计.doc
《哈夫曼编译码器数据结构课程设计.doc》由会员分享,可在线阅读,更多相关《哈夫曼编译码器数据结构课程设计.doc(16页珍藏版)》请在沃文网上搜索。
1、摘要哈夫曼编码是根据字符的使用率的高低对字符进行不等长的编码,从而使使用率高的字符占用较少的空间,从而在传输的过程中大大提高了数据的空间传输效率。本设计采用二叉链表的存储结构,建立哈夫曼树;用递归调用的方式对哈夫曼树的节点进行编码,生成与字符对应的哈夫曼编码。本设计完全采用C+语言进行编程,并在XCode 6编译器上调试运行通过。本程序使用中文界面,并有相应的提示信息,便于操作和程序运行。关键词:哈夫曼树;哈夫曼编码;递归调用;二叉链表AbstractHuffman coding is based on the level of usage of characters ranging from
2、 long coding, so that high usage rate of the characters occupy less storage space , in the course of transmission has greatly enhanced the efficiency of data transmission space. This design build the Huffman tree by using Binary Tree storage structure, encoded Huffman tree nodes by recursive calling
3、, and the characters generate the corresponding Huffman coding. The procedure completely write with C+ language and has Chinese explanatory note. Whats more, it was debugged in XCode 6 debugger and run well. The whole procedure, with Chinese interface and the corresponding tips ,is convenient to run
4、 and easy to be operated.Keywords: Huffman Tree; Huffman code; Recursive call; Binary List 目 录摘要1ABSTRACT2一、问题描述(内容格式参考下面的描述,以下类似)41、问题描述:42、基本要求:4二、需求分析42.1 设计目标42.2 设计思想4三、概要设计53.1程序结构53.2 初始化算法:53.3 编码算法:53.4 译码算法:5四、数据结构设计5五、算法设计61、算法分析(必须要用语言进行描述)62、算法实现7六、程序测试与实现121、主程序122、测试数据133、测试结果14生成哈夫曼树
5、运行结果图:14哈夫曼编码运行结果图:15编码函数运行结果图:15译码函数运行结果图:15平均编码长度函数运行结果图:15七、调试分析15程序调试的步骤:15调试体会:16八、遇到的问题及解决办法16九、心得体会16一、问题描述(内容格式参考下面的描述,以下类似)1、问题描述:利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。试写一个哈夫曼编/译码系统。2、基本要求:一个完整的系统应具有以下功能:(1)初始化。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树
6、,并将它存于文件中。(2)编码。利用已建好的哈夫曼树对文件中的正文进行编码,然后将结果存入文件中。(3)译码。利用已建好的哈夫曼树将文件中的代码进行译码,结果存入文件中。(4)完成数据测试,要求编码字符不低于15个,编码文件的长度不低于50个字符。(5)计算平均编码长度。二、需求分析2.1 设计目标一个完整的系统应具有以下功能:1)初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件Tree.out中。输出哈夫曼树,及各字符对应的编码。2)输入(Input)。从终端读入需要编码的字符串s,将字符串s存入文件Orinigal.txt
7、中。3)编码(Encode)与译码(Decode)。编码(Encode)。利用已建好的哈夫曼树(如不在内存,则从文件Tree.out 中读入),对文件Orinigal.txt中的正文进行编码,然后将结果存入文件CodeOrinigal.txt中。译码(Decode)。利用已建好的哈夫曼树将文件CodeOrinigal.txt中的代码进行译码,结果存入文件TextFile中。输出编码文件(Print)。将编码显示在终端上。同时将此字符形式的编码写入文件Code.out中。4)打印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符
8、形式的哈夫曼树写入文件Tree.out中。5)计算编码平均长度。计算编码平均长度,并显示在屏幕上。 2.2 设计思想哈夫曼编码(Huffman Coding)是一种编码方式,以哈夫曼树即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这种方法是由David.A.Huffman发展起来的。例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位(bit)来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位
9、。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。三、概要设计3.1程序结构Main()Initialization()初始化程序EnCode();编码DeCode();译码Code_length()平均编码长度Print()打印数据3.2 初始化算法:程序从文件data.in中获取26个英文字母以及对应的权值。3.3 编码算法:(1)对输入的一段欲编码的字符串进行统计各个字符出现的次数,并它们转化为权值w1,w2,,wN构成n棵二叉树的集合F=T1,T2,,Tn把它们保存到结构体数组HTn中,
10、其中Ti是按它们的ASC码值先后排序。其中每棵二叉树Ti中只有一个带权为Wi的根结点的权值为其左、右子树上根结点的权值之和。 (2)在HT1.i中选取两棵根结点的权值最小且没有被选过的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左、右子树上根结点的权值之和。 (3)哈夫曼树已经建立后,从叶子到根逆向求每一个字符的哈夫曼编码。 3.4 译码算法: 译码的过程是分解电文中字符串,从根出发,按字符0,或1确定找左孩子或右孩子,直至叶子结点,便求的该子串相应字符并输出接着下一个字符。四、数据结构设计1 元素类型,结点类型,指针类型struct element /哈夫曼树结点 cha
11、r data; /数据域 int weight; /权值 int lchild, rchild, parent; /左孩子右孩子,父结点 int flag;struct Code /编码 int bitMaxSize; /编码 int start; /开始位置 int weight; /权值;struct Encode /编码 string code; /编码 char data; /编码对应的值 int flag;int wMaxSize; /存放权值的数组int n; /n个字符int root; /根结点Code HuffCodeMaxCode; /哈夫曼编码数组Encode encod
12、eMaxSize; /编码数组element huffmanTreeMaxSize; /哈夫曼树结点2.包含的函数 Huffman(); Huffman() void HuffmanTree(); /建立哈夫曼树 void Initialization(); /初始化程序 void PrintHuffman(element H, element HH, int n); /打印哈夫曼树 void HuffmanCode(); /生成哈夫曼编码 void PrintCode(); /打印哈夫曼编码 void FileCode(); /文件输出哈夫曼编码 void FileHuffman(eleme
13、nt H, element HH, int n); /文件输出哈夫曼树 int getRoot() return root; /获取根结点 void Code_length(); /计算平均编码长度 void EnCode(); /为文件编码 void ReadCode(); /读取字符以及对应的哈夫曼编码 void Decode(); /为编码文件译码五、算法设计 1、算法分析(必须要用语言进行描述)哈夫曼树给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树是带权路径长度最短的树,权值较大的结
14、点离根较近。哈夫曼树的构造一、对给定的n个权值W1,W2,W3,.,Wi,.,Wn构成n棵二叉树的初始集合F= T1,T2,T3,.,Ti,.,Tn,其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算 法,一般还要求以Ti的权值Wi的升序排列。)二、在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。三、从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。四、重复二和三两步,直到集合F中只有一棵二叉树为止。哈夫曼编码哈夫曼编码(Huffman Coding)是一种编码方式,
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼编 译码器 数据结构 课程设计
