哈夫曼编码和译码的设计与实现.pdf





《哈夫曼编码和译码的设计与实现.pdf》由会员分享,可在线阅读,更多相关《哈夫曼编码和译码的设计与实现.pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、哈夫曼编码和译码的设计与实现1/13 算法与数据结构课程设计哈夫曼编码和译码的设计与实现1.问题描述利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼码的编/译码系统。哈夫曼编码和译码的设计与实现2/13 2.基本要求a.编/译码系统应具有以下功能:(1)I:初始化(Initialization)。从终端读入字符集大小n,以及 n 个字符和 n 个权值,建立哈夫曼
2、树,并将它存于文件hfmTree 中。(2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件 hfmTree 中读入),对文件 ToBeTran中的正文进行编码,然后将结果存入文件 CodeFile 中。(3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile 中的代码进行译码,结果存入文件TextFile中。(4)P:印代码文件(Print)。将文件 CodeFile 以紧凑格式显示在终端上,每行 50 个代码。同时将此字符形式的编码文件写入文件CodePrin中。(5)T:印哈夫曼树(Tree printing)。将已在内存中的哈夫曼树以直观的
3、方式(树或凹入表形式或广义表)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。b.测试数据(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 字
4、符 N O P Q R S T U V W X Y Z 频度57 63 15 1 48 51 80 23 8 18 1 16 13需求分析3.1 程序的基本功能本程序可以对任何大小的字符型文件进行Huffman 编码,生成一个编码文件。并可以在程序运行结束后的任意时间对它解码还原生成字符文件。即:先对一条电文进行输入,并实现 Huffman 编码,然后对 Huffman 编码生成的代码串进行译码,最后输出电文数字哈夫曼编码和译码的设计与实现3/13 3.2输入/输出形式当进行编码时输入为原字符文件文件名,当程序运行编码完成之后输入编码文件名(默认名为 code.dll)。当进行译码时输入为编码
5、文件名(默认名为code.dll),从文件中读取Huffman编码树后输入字符文件的文件名。3.3测试数据要求本程序中测试数据主要为字符型文件。4概要设计1.系统结构图(功能模块图)2功能模块说明(1).编码:提示要编码的文件文件名读取文件以字母出现次数为权值建立哈弗曼树对文本进行哈弗曼编码并输出编码提示将编码保存的文件名保存编码文件;(2).译码:提示输入要译码的文件名利用建立好的哈弗曼树进行译码将译码输出提示保存译码文件的文件名保存译码文件;(3).退出:退出系统,程序运行结束。5详细设计创建哈弗曼树哈弗曼树编码译码器编码译码退出哈夫曼编码和译码的设计与实现4/13 编码开始初始化哈夫曼链
6、表且有 2n-1 个节点i=1 Iweight=counti p=p-next for(i=n;iParent=HT2-Parent=p p-LChild=HT1 p-RChild=HT2 p-weight=HT1-weight+HT2-结束哈夫曼编码和译码的设计与实现5/13 译码开始将 字 符 存 入 哈 夫曼 编 码 结 构 体 数组的字符单元中if(q=q-Parent-LChild)HCi.code-HCi.start=0 HCi.code-HCi.start=1 p=p-next I=n 时结束哈夫曼编码和译码的设计与实现6/13 6调试分析1.从叶子节点开始向上遍历二叉树,获得哈
7、夫曼编码;2.根据哈夫曼编码遍历哈夫曼树直到叶子节点,获得译码3.算法的时间复杂度分析:程序部分用双循环嵌套结构,时间复杂度为 O(n2).4算法的空间复杂度分析:算法的空间复杂度为O(n)5.程序需要反复调试,并且调试过程比较慢,需要有一个比较正确的调试方法,更需要我们有耐心7用户使用说明开始Root 指向根节点P!=root codei=0 p=p-LChild p=p-Rchild p-LChild=NULL&p-RChild=NULL sk+=strj p=root 结束哈夫曼编码和译码的设计与实现7/13 1.输入字符的个数n 2 输入 n 个字符和 n 个权值3 选择(15)操作可
8、对 huffman 树进行编码和译码以及huffman 树表的打印4 退出系统8测试结果哈夫曼编码和译码的设计与实现8/13 哈夫曼编码和译码的设计与实现9/13 9附录#include stdio.h#include stdlib.h#include string.h#define MAX 100 struct HafNode int weight;int parent;char ch;int lchild;int rchild;*myHaffTree;struct Coding char bitMAX;char ch;int weight;*myHaffCode;void Haffman(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 译码 设计 实现

限制150内