- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
北邮数据结构实验哈夫曼树
数据结构实验报告
实验名称: 实验三——哈夫曼树
学生姓名:
班 级:
班内序号:
学 号:
日 期: 年月日
1.实验要求
利用二叉树结构实现赫夫曼编/解码器。
基本要求:
初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立赫夫曼树
建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。
编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。
打印(Print):以直观的方式打印赫夫曼树(选作)
计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。
2. 程序分析
1.程序主要是通过一个类来实现
类中主要包含对输入的字符串进行的处理:
首先对输入的字符串进行统计,将字符串中出现的字母的次数初始化为字母的权值
1.void CreatHTree(int a[],int n);//创建哈夫曼树
对输入的字母及其权值建立哈夫曼树
2.void CreatCodeTable(char b[],int n,int a[]);//创建编码表
对哈夫曼树进行编码,创建哈夫曼编码表
3.void Encode(char s1[],char c[],int m,int n);//编码
对字母及其权值进行编码,找到其各字母的哈夫曼编码
4.void Decode(char s1[],char b1[],int n);//解码
对字符串的哈夫曼编码串进行解码
5.void Selectmin(int x,int y,int start,int end);//寻找权值和最小的两个字母
6.void Reverse(char (code)[100],int k);//编码倒置
2.1 存储结构
哈夫曼树:
例如:
weight lchild rchild parent
2.2 关键算法分析
1.void CreatHTree(int a[],int n);//创建哈夫曼树
对输入的字母及其权值建立哈夫曼树
其中主要是寻找权值和最小的两个,
算法:.构建一个数组,将其的父母为-1的weight相比较。并存入数组,找出数组中权值最小的两个,并修改哈夫曼树。
2.void CreatCodeTable(char b[],int n,int a[]);//创建编码表
对哈夫曼树进行编码,创建哈夫曼编码表
对于构建的哈夫曼树进行编码:左子树标记为0,右子树标记为1,找到对于出现的字母进行编码。并打印编码表
3.void Encode(char s1[],char c[],int m,int n);//编码
对输入的字符串中的字母,找到其各字母的哈夫曼编码并打印
3. 程序运行结果
[内容要求]
测试主函数流程:流程图如图2所示
流程图示意图
输出结果:
总结
4.1
在编写程序时,我先定好计划,然后着手实践,跟着书本先编写了有关的算法。然后编写各个函数。如:创建哈夫曼树,创建哈夫曼编码,对输入的字符串进行编码以及解码等。我一步一步来,我先把一个大概的东西写出来,虽然一开始运行还是失败的,但是我知道我的整体路线没有错,然后我开始在适当的地方一步一步调试,接着慢慢地修改函数,咨询那些很强的同学,最后,我也写出来了。虽然我写的程序不如别人的那么强大,功能那么多,更不如那些写出其他代码的同学那么创新。不过这毕竟也是我的成果吧,在以后学习的过程中,我想我也会如此般尽力去完成自己的事情,虽然没别人那么好,但是自己确实感觉到自己进步了,而且学到了很多以前都没有学到或者没有学好的东西。
所以,其实我觉得这次实习是一次有趣的体验。既让我感受到了成功的喜悦,又让我学到了好多东西。我很开心,也将继续这样努力着。我期待着,成为一名较专业的“程序员”之后,我可以写出更好的东西,其实就算是一个看起来很简单的程序,也可以添加很多功能来,并且我认为,编程会不停地更新,我们可以不停地更新自己的程序,让程序更好、更简洁。这就是我的目的,我会一直加油。1
4.2
改进:希望能打印出哈夫曼数
北京邮电大学信息与通信工程学院
第1页
北京邮电大学电信工程学院
第1页
9
5
2
7
16
6
7
13
29
0
0
0
0
1
1
1
1
结束
输出
对编码串进行解码
创建哈夫曼编码表
对输入字符串进行编码
等待用户输入
开始
建立哈夫曼树
是否退出
文档评论(0)