收藏 分享(赏)

北邮信通院数据结构实验报告三哈夫曼编码器.doc

上传人:精品资料 文档编号:10544457 上传时间:2019-11-27 格式:DOC 页数:20 大小:330.50KB
下载 相关 举报
北邮信通院数据结构实验报告三哈夫曼编码器.doc_第1页
第1页 / 共20页
北邮信通院数据结构实验报告三哈夫曼编码器.doc_第2页
第2页 / 共20页
北邮信通院数据结构实验报告三哈夫曼编码器.doc_第3页
第3页 / 共20页
北邮信通院数据结构实验报告三哈夫曼编码器.doc_第4页
第4页 / 共20页
北邮信通院数据结构实验报告三哈夫曼编码器.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、北京邮电大学信息与通信工程学院第 1 页数据结构实验报告实验名称: 实验三 树哈夫曼编/解码器学生姓名: 班 级: 班内序号: 学 号: 日 期: 2014 年 12 月 11 日1实验要求利用二叉树结构实现赫夫曼编/解码器。基本要求:1、初始化(Init):能够对输入的任意长度的字符串 s 进行统计,统计每个字符的频度,并建立赫夫曼树2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。3、编码(Encoding) :根据编码表对输入的字符串进行编码,并将编码后的字符串输出。4、译码(Decoding) :利用已经建好的赫夫曼树对编码后的字符串进行

2、译码,并输出译码结果。5、打印(Print):以直观的方式打印赫夫曼树(选作)6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。测试数据:I love data Structure, I love Computer。I will try my best to study data Structure. 提示:1、用户界面可以设计为“菜单”方式:能够进行交互。2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码。北京邮电大学信息与通信工程学院第 2 页2. 程序分析2.1 存储结构Huffman 树给定一组具有确定权值的叶子结点,可以构造出

3、不同的二叉树,其中带权路径长度最小的二叉树称为 Huffman 树,也叫做最优二叉树。weight lchild rchild parent北京邮电大学信息与通信工程学院第 3 页2 -1 -1 -15 -1 -1 -16 -1 -1 -17 -1 -1 -19 -1 -1 -1weight lchild rchild parent2 -1 -1 55 -1 -1 56 -1 -1 67 -1 -1 69 -1 -1 77 0 1 7北京邮电大学信息与通信工程学院第 4 页13 2 3 816 5 4 829 6 7 -12.2 关键算法分析(1)计算出现字符的权值利用 ASCII 码统计出现

4、字符的次数,再将未出现的字符进行筛选,将出现的字符及頻数存储在数组 a中。void Huffman:Init()int nNum256= 0; /记录每一个字符出现的次数int ch = cin.get(); int i=0; while(ch!=r) /统计字符出现的次数stri+ = ch; /记录原始字符串ch = cin.get(); /读取下一个字符stri=0;n = 0;北京邮电大学信息与通信工程学院第 5 页for ( i=0;i0) /若 nNumi=0,字符未出现ln = (char)i; an = nNumi; n+;时间复杂度为 O(1) ;(2)创建哈夫曼树:算法过程

5、: Huffman 树采用顺序存储-数组; 数组的前 n 个结点存储叶子结点,然后是分支结点,最后是根结点; 首先初始化叶子结点元素循环实现; 以循环结构,实现分支结点的合成,合成规则按照 huffman 树构成规则进行。 关键点:选择最小和次小结点合成。 void Huffman:CreateHTree()HTree = new HNode 2*n-1; /根据权重数组 a0n-1 初始化 Huffman 树for (int j = 0; j hTreei2.weight) /i1 指向最小的 int j=i2; i2=i1; i1 = j; /开始找最小的两个i+;for( ; i#inc

6、lude using namespace std;struct HNode int weight; /结点权值int parent; /双亲指针int LChild; /左孩子指针int RChild ; /右孩子指针; struct HCodechar data;char code100;class Huffmanprivate:HNode* HTree; /Huffman 树 HCode* HCodeTable; /Huffman 编码表char str1024; /输入的原始字符串char l256; /叶子节点对应的字符int a256; /记录每个出现的字符的个数public:创建编

7、码表生成编码串解码结束北京邮电大学信息与通信工程学院第 13 页int n; /叶子节点数void Init(); /初始化void CreateHTree(); /创建 huffman 树void CreateCodeTable(); /创建编码表void PrintTable();void Encode(char *d); /编码void Decode(char *s, char *d); /解码void Print(int i,int m); /打印 Huffman 树void SelectMin( HNode *hTree,int n, int /找出最小的两个权值void Rever

8、se(char* s); /逆序void Compare(char*d); /比较压缩大小 Huffman(); /析构;void Huffman:Init()int nNum256= 0; /记录每一个字符出现的次数int ch = cin.get(); int i=0; while(ch!=r) /统计字符出现的次数stri+ = ch; /记录原始字符串ch = cin.get(); /读取下一个字符stri=0;n = 0;for ( i=0;i0) /若 nNumi=0,字符未出现ln = (char)i; an = nNumi; n+;void Huffman:CreateHTre

9、e()HTree = new HNode 2*n-1; /根据权重数组 a0n-1 初始化Huffman 树北京邮电大学信息与通信工程学院第 14 页for (int j = 0; j hTreei2.weight) /i1 指向最小的 int j=i2; i2=i1; i1 = j; /开始找最小的两个i+;for( ; im;switch(m)case 1:HFCode.Print(2*HFCode.n-2,1);break;case 2:HFCode.PrintTable( );break;case 3:北京邮电大学信息与通信工程学院第 18 页cout“编码结果:“dendl;brea

10、k;case 4:cout“解码结果:“sendl;break;case 5:HFCode.Compare(d);运行结果:北京邮电大学信息与通信工程学院第 19 页北京邮电大学信息与通信工程学院第 20 页4. 总结在编程时,最开始在字符统计时出现了空格无法统计的问题,后来用 cin.get()函数进行统计。最后由于有一些字符没有出现过,所以还需要进行筛选。在输出哈夫曼树时 ,采用了凹入函数法进行输出,更加直观。创建编码表时 ,开始是自下到上的进行遍历,所以最后还需要进行逆序,形成最终的编码表。创建编码树的时候,没有正确运用指针的传递,结果出现了很多问题,各种内存访问错误,最后经过细细地从头到尾检查,发现了是在形式参数的地方出现了错误,在获取两个最小权值的结点的时候应该用引用,改过来之后错误没有了。打印赫夫曼树是最难的部分,一开始没有找到合适的办法,出现了很多问题,最后采用凹入表示打印的方法,从最右边的结点开始一行一行的打印,最后问题也能解决了。调试时,出现的问题是在进行编码时循环出现了错误,导致运行后编码变少,通过修改问题得以解决。通过哈夫曼编码的程序设计,更加深入的学习了哈夫曼树编码的思想,了解了不等长编码的思想,同时也通过实践明白了编码器的原理,在编码过程中,面对出现的问题,也学习了字符串的相关函数的运用,更加了解树的存储结构,受益匪浅。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报