哈夫曼编码译码器实验报告.docx
《哈夫曼编码译码器实验报告.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码译码器实验报告.docx(18页珍藏版)》请在三一办公上搜索。
1、问题解析与解题方法问题分析:设计一个哈夫曼编码、译码系统。对一个ASCII编码的文本文件中的字符进行哈夫曼 编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件。(1)从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt);(2)统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);(3)根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;(4)将文本文件利用哈夫曼树进行编码,存储成压缩文件(编码文件后缀名.huf)(5)用哈夫曼编码来存储文件,并和输入文本文件大小进行比较,计算文件压缩率;(6)进行译码,将huf文件译码为ASCII编码的txt文件
2、,与原txt文件进行比较。根据上述过程可以知道该编码译码器的关键在于字符统计和哈夫曼树的创建以及解 码。哈夫曼树的理论创建过程如下:一、构成初始集合对给定的n个权值W1,W2,W3,.,Wi,.,Wn构成n棵二叉树的初始集合F=T1,T2,T3,.,Ti,.,Tn,其中每棵二叉树Ti中只有一个权值为Wi的根结点, 它的左右子树均为空。二、选取左右子树在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树 的根结点的权值为其左右子树的根结点的权值之和。三、删除左右子树从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。四、重复二和三两步,重复二和三两步,直到集合F
3、中只有一棵二叉树为止。因此,有如下分析:1. 我们需要一个功能函数对ASCII码的初始化并需要一个数组来保存它们;2. 定义代表森林的数组,在创建哈夫曼树的过程当中保存被选中的字符,即给定报文中出现的字符,模拟哈夫曼树选取和删除左右子树的过程;3. 自底而上地创建哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然 后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码;4. 从哈弗曼编码文件当中读入字符,根据当前字符为0或者1的状况访问左子树或者右孩子,实现解码;5. 使用文件读写操作哈夫曼编码和解码结果的写入;解题方法:结构体、数组、类的定义:1. 定义结构体类型的signode作为哈
4、夫曼树的节点,定义结构体类型的hufnode作 为哈夫曼编码对照表的节点,定义HFM类实现对哈夫曼树的创建,利用其成员函 数完成哈夫曼编码译码的工作。2. 定义signode类型的全局数组 SN256(为方便调用,之后的forest256,hufNode256均为全局数组),保存ASCII编码的字符,是否在文章中出现(bool类型)以及出现次数(int类型,权重),左右孩子节点位置,父节点位置信息;3. 为节省存储空间,定义signode *类型的全局数组forest256,模拟森林,在创建 哈夫曼树的过程中保存出现字符的指针,模拟哈夫曼树选取和删除左右子树的过 程;4. 定义hufnode类
5、型的全局数组hufNode256,在编码时最为哈夫曼编码对照表的 节点,char型c保存字符,int code100保存其哈夫曼编码;5. 定义HFM类,主要保存哈夫曼树的根节点指针,但其丰富的功能函数将实现哈夫 曼编码译码的工作及其他功能;函数介绍:1. void init(signode * sig)(初始化数组 SN;2. void compress()(输出压缩对比情况的信息;3. void exchange()(用两层for循环实现hufNodei节点的成员哈夫曼编码数组code前后元素的对换,因为在之前的编码过程中由于是从叶节点追溯至根节点, 存入code数组的哈夫曼编码与哈夫曼编
6、码的概念反向,故而要调整;4. signode * getroot()(返回哈夫曼树的根节点指针;5. signode * HFM:creat()(创建哈夫曼树,首先用三个for循环查看forest数组,找到权值最小的两个字符,以int型的min1,min2记录其下标,定义signode *类 型指针pp指向新生成signode节点,用指针操作使pp指向的节点的权值为 min1,min2权值之和,pp做孩子指向forestmin1,右孩子指向forestmin2, min1,min2的父指针指向pp,然后将pp存入min1的位置,min2之后的每一个 节点依次往前移一个位置实现从forest数
7、组中清除min1,min2并加入pp的操作;6. void HFM:hufcode()(哈夫曼编码,用for循环控制查看hufNode数组,其初始化已在creat()的开始完成,对每一个字符实现编码,用while循环从叶节点 开始,如果该节点是其父节点的左孩子就将codehufNodei.size+赋值0,否则 赋为1,直至当前节点的父节点为空,while循环结束;7. void HFM:savewithhufcode(FILE * inf,FILE * outf)将读入的文章以哈夫曼编码的形式存储,其中inf为读入文件的指针,outf为写入文件的指针,首先调用 rewind(inf)函数将光
8、标放置在文章开头,防止文件未关闭导致的错误,每读一个字 符就用for循环在hufNode数组中查找,因为hufNode数组就是保存出现的字符 的,故一定可以找到,然后再用fputc函数将code数组的内容写入文件,直至读 入文件结束;8. void HFM:inorder(signode * sig)迭代法遍历树,遍历到叶节点时执行hufNodecount+.sig=sig语句实现hufNode数组指向文章中出现的字符;9. int HFM:maxc().计数变量,记录哈夫曼编码最大位数;10. void HFM:hufdecode(FILE* ipf,FILE* opf)解码,从哈夫曼编码到
9、字符,输出到屏幕和指定的文件中;11. void input(FILE * f).初始读入文章,保存出现的字符记录修改其权重;数据结构选择与算法设计数据结构选择:signode :struct signode(/signode节点,哈夫曼树节点/char c;int weight;bool b;signode * parent;signode * left;signode * right;signode()(字符/权重/文章中是否出现初始化c=NULL;b=false;weight=0;parent=left=right=NULL;C weightb | parentleftrighthufn
10、ode:struct hufnode(哈夫曼编码对照表节点/signode * sig;int code100;保存哈夫曼编码int size;bool b;hufnode()(sig=NULL;size=0;b=true;;Sigcode100sizeHFM:class HFM(private:signode * root;signode * pt;/int alleaf;public:HFM(int all)(root=pt=NULL;alleaf=all;HFM()signode * getroot()return root;signode * creat();void hufcode(
11、);哈夫曼类/哈夫曼树根/编码时做哨兵指针/all是森林中树的个数/创建哈夫曼树/编码/void savewithhufcode(FILE * inf,FILE * outf);用哈弗曼编码存储文件/void hufdecode(FILE* ipf,FILE* opf);解码/void inorder(signode * sig);int maxc();求取哈弗曼编码最大长度/Rootpt | alleafcreat() hufcode() savewithhufcode(inf,outf)inorder(sig)getroot()hufdecode(ipf,opf)maxc()算法设计:测试
12、结果Doc 窗口:out of the orphanage and into the city. 1 14 25 51 12 18 1931423331parents and f Lili of hope. He did not believe that he was abandoned, has been th inking parents would come to him. Finally one day, following his music, he walke| d T h1917211010 F:C + +what i have doneHMFhuffumanDebughuffu
13、man.exe”| U回 I S2j码:011111壁厂一解码遂着压缩率顼L F:C+what i have doneHMFhuffumanDebughuffuman.exe呈符s的哈夫曼编码:11010 字符u的哈夫曼编码:11m。 字符u的哈夫曼编码Himio 字符.的哈夫曼编码 字符e的哈夫曼编码:1110 生技1的哈夫曼褊码=mi0 宅符g的哈夫曼编码=1111100 倪机的哈夫曼编码= 1111101 岸特f的哈夫曼编码:莅擞迎心查看哈关晏编码2 墅丢曼解码 3.查看压缩率+ +v/hat i have doneHMFhuffumanDebughuffuman.exeT id 1 2
14、 3o 1 na a 1 o h 1 w p. a r i ftsQ. ndentlie身码率 nirt 牛.盲 a4-4.用纤 tspof哈曼压 enngt 看着 arkiOu查笛一 p n -1=1 回|2 一哈夫曼解码压缩率3压缩前:2248hit 压缩后:1201bit.010 = 0-534253查看哈夫曼编码2噬丢曼解码3-fit压缩率years, has been front of theii lie was abandoned, has been th following his music, he walke11that1 oidn.td-:h t e n Hoit- d e
15、 e n p n a o o编ndenlhe景码率 Hart夫解缩 tspof哈曼压 ennsrt 看言 ar!iOu查譬: pind LI2.I3.3 压压文件读写(部分):9| pral -记事本-I 口:回思r文件旧漏辑EJ格式。查卷叫帮助HJThe little boy Evan lived in institutions for 11 ycarss has been front of their p;arents and ful 1 of hope. He did not beli已第己 that he was ab;3ndon已田 has been t上linlfins p;3re
16、nts woi-ild conie to him. Finally one day, following his iriLimic: he walked out of the orph;anage and into the city.4窗pra2 -记事本口|回1思J交住旧蝙激EJ格式。亘尊帮助010111000100111000111101000100110011111011100001111110101011 000001011101110111001101100101101001111010001101110111010111 001000110000100011001101010011
17、000100111011010011000101 011001 101000111111101001010000101111010111100101100111001100101011 010101101000100011011OlOOOOlllll1110111011000011111101010101 011001001001010111111001001010011101000010100001110001100101 011101100100111010000110110010111001111111101101111011110001 010111111000100101001110
18、011101101111000111010011100010111100 010111001100101010010001111111101111010001110110111011100010 01010001101001000100111000011110011011010000110011111011on0 01011110101100111010111101101000100011011 0100001111111101110 110000100101001000110001110111000110011111000001110001100101 0111011001001110100
19、00111101010110110111101011100111110110100 101101110001001101000010010000101101101111000111010110001100 011011110111101011000010101100111000101110110101100101101001 mill 01011110111101010011110100011 OOlllll 00000100100011 OlOO 001011011011011010100011111011011010001001110000111100110111 100111011111
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 译码器 实验 报告
链接地址:https://www.31ppt.com/p-5083527.html