ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:139.58KB ,
资源ID:8420791      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8420791.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(哈夫曼编码译码报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

哈夫曼编码译码报告.docx

1、哈夫曼编码译码报告烟台大学计算机与控制工程学院课 程 设 计(数据结构与OOP)设计题目: 班 级姓 名学 号指导教师成 绩年 月 日1 题目1.1 问题描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理项目,直到选择退出为止。1.2 基本要求1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目中2) 分别采用动态和静态存储结构3) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树4) 编码:利用建好的哈夫曼树生成哈夫曼编码5) 输出编码6) 设字符集及频度如下表:字符 空格 A B C D E F G H I J K L M频度 186 64

2、 13 22 32 103 21 15 47 57 1 5 32 20字符 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 11.3 进一步完成1) 译码功能2) 显示哈夫曼树3) 界面设计的优化2 内容2.1 基本需求 编写一个哈夫曼编码/译码器,次编码/译码器有两大主要功能:一是对一段文本进行编码,比如在利用电报机发送信息时,需要将文字“ABACCDA”转换成类似“00110111001”这样的二进制组成的字符串;二是对一段密文进行译码,比如在接收电报后,需要对“0101110100101”这样的二进制密文通过某种

3、标准译码成看得懂的文字信息。 另外还有一些辅助功能,比如可以打印一些简单的哈夫曼树的简图、有基本的主菜单、简洁的操作界面、文件的读写。2.2. 我的设计 哈夫曼编码/译码器主要有五个功能:初步编码、文件编码、手动译码、文件译码、退出。 初步编码:实现基本的编码,打印简单的哈夫曼树。输入N个字符和N个权值,输出每个字符对应的编码并打印哈夫曼树。注意此功能只是对哈夫曼编码的初探,只完成了生成哈夫曼树和哈夫曼编码的功能并没有实现文件的编码。 文件编码:对一个特定的文件进行编码,注意编码标准可以使用保存在data.txt中的默认标准也可以使用自己定义的标准。 手动译码:对手动输入的密文进行译码,译码标

4、准可自定义或默认。 文件译码:对存放密文的文件进行译码,与手动译码的主要区别就是在密文的获取方法上。 退出:哈夫曼编码/译码器运行结束。3 算法设计3.1 数据的存储结构3.1.1 存放哈夫曼树的存储结构: typedef struct /存放树节点 char data; /节点代表的字符 int weight; /权值 int parent; /父节点 int lchild; /左孩子节点 int rchild; /右孩子节点HTNode;3.1.2 存放哈夫曼编码的存储结构: typedef struct /存放编码 char cd60; / int start; /编码在数组中的开始下标

5、HCode;3.1.3 存放哈夫曼树每个节点位置的存储结构:typedef struct /节点位置 char data; int n;/在完全二叉树中的位置序号tree;此存储结构的主要目的是记录哈弗曼树的每一个节点在完全二叉树上的位置序号,便于输出哈弗曼树的大致图形。3.2 生成哈弗曼树的算法算法思想:先将存有每个节点权值和数据的数组初始化,将每个节点的左右节点和父节点初始化为-1,保证每个节点都是独立的。假设有n 个节点,在建树时需要比较n-1次;在每一次的比较中,先找出两个权值最小的节点,将这两个节点作为孩子节点形成一个双亲节点并修改相应的属性值,形成的双亲节点的权值等于两孩子节点的和

6、,双亲节点继续参加下一次的比较。最后得到的那个节点就是树的根节点。算法流程图:代码实现:void CreateHT(int n,HTNode ht60)/构造哈夫曼树 int i,k,lnode,rnode; int min1,min2; for(i=0;i2*n-1;i+) hti.parent=hti.lchild=hti.rchild=-1; for(i=n;i2*n-1;i+) min1=min2=32767; lnode=rnode=-1; for (k=0;k=i-1; k+) if (htk.parent=-1) if (htk.weightmin1) min2=min1;rno

7、de=lnode; min1=htk.weight; lnode=k; else if (htk.weightmin2) min2=htk.weight; rnode=k; htlnode.parent=i; htrnode.parent=i; hti.weight=htlnode.weight+ htrnode.weight; hti.lchild=lnode; hti.rchild=rnode; 3.3 生成哈弗曼编码的算法算法思想:算法前提是哈弗曼树已经建立完成,假设有n个节点,这时每个节点都是叶子节点,只需从叶子节点向上找到根节点就可得到哈弗曼编码;此过程需要进行n次循环,在每次循环中

8、顺着叶子节点向上遍历。如果它为左孩子它所代表的编码数组增加一个字符1,右孩子则增加一个字符0,以此规律直到找到根节点,注意编码数组是从下标为n的位置开始依次向前存的。算法流程图:代码实现:void CreateHCode(int n,HTNode ht60,HCode hcd60)/得到哈弗曼编码 int i,f,c; HCode hc; for(i=0; in; i+) hc.start=n; c=i; f=hti.parent; while(f!=-1) if(htf.lchild=c) hc.cdhc.start-=0; else hc.cdhc.start-=1; c=f; f=htf

9、.parent; hc.start+; hcdi=hc; 3.4 译码的算法算法思想:算法前提是哈弗曼树已经建立完成,假设待译码的密文为“010*”,这时就可以利用密文和哈弗曼树进行译码;密文从开头开始,哈弗曼树从根节点开始一一对应向前向下推进,如果密文为0则向该节点的右节点推进,为1则向左节点推进,当走到叶子节点时说明译码出了一个字符;之后再次返回根节点继续上一次的操作直到密文结束,注意密文必须连续且不重复使用。算法流程图:代码实现:void decipher(int n,HTNode ht60,string code)/解码 int i,j=0; i=2*n-2;/根节点的下标 cout译

10、码结果:n; int mi=1; for(int j=0;jcode.length();j+) if(codej=0) i=hti.lchild;/向下左 else if (codej=1) i=hti.rchild;/向下右 else mi = 0; break; if(hti.lchild=-1) couthti.data; i=2*n-2; if(mi=0) cout密文有误n; if(hti.lchild!=-1&i!=2*n-2) cout密文不完整n; 3.5 打印哈弗曼树的算法算法思想: 要想打印哈弗曼树的大致图形,首先要计算出哈弗曼树的每个节点在相应的二叉树中的序号,然后是控制

11、节点间的空格和每行开始的空格。节点位置通过哈弗曼编码得到,位置f初始为1,对于每个节点从编码的第一个开始依次向后,如果为0 则f=f*2+1,为1则f=f*2,一直到编码结束即可算出最终位置。空格的解决方法是从最后一行到第一行节点间空格的数量分别是1、3、7.2i-1个,每行开头的空格分别是1、4、82i个。算法流程图:3.6 其他算法 除了以上复杂的算法,还有一些简单的算法。比如限制输入的算法,只有当控制台输入某几个特定的字符时才会做出相应的反应;数据拆分算法,将从文件读入的数据进行拆分,把数字和非数字分别存入各自的数组里。4 程序正确性验证 4.1 输入数据的控制 图1:主界面选择控制图2

12、:返回界面控制图3:编码标准选择控制运行解释:在主界面只有输入0-4中的数程序才会执行,返回界面也是如此;在选择Y或N时只有输入Y或N时程序才能。4.2 打印哈弗曼树图3 :哈弗曼树的简图运行解释:我写的算法只有当节点较少时,才能看出哈弗曼树的大致图形。详情请见 3.5。4.3 哈弗曼编码 图4:哈弗曼编码运行解释:当文件不存在时程序会提示重试,data.txt文件中存的是字符和字符的权值,也可以用自定义的编码标准,data3.txt中存的是待编码的字符。4.4 哈弗曼译码 运行解释:如果要翻译的密文不完整,则会提示;5 遇到的问题这次的实验还算顺利,没有遇到太大的问题。刚开始对哈弗曼编码/译

13、码的算法不是太了解,入手比较困难,但通过努力现在已经熟练掌握;再一个是文件读写的知识有点遗忘,浪费了点时间。我觉得打印哈弗曼树的那部分比较麻烦点,因为有些规律需要找,比如每行开头空几个空格才合适、节点间的空格是几个、节点什么时候输出才正确。 最后我要强调一个重要的点,在做大项目之前务必和老师讨论一下项目的需求,这样能更好的完成项目。6 课程设计的主要收获这次的实验收获很多,通过对哈弗曼编码/译码器的设计,我熟练掌握了哈弗曼编码和译码的算法实现,了解了哈弗曼编码译码的用途和现实意义;同时对文件操作也有了较深的理解;感觉自己的编码能力有了进一步的提高,对数据结构有了更高的兴趣。 7 对今后课程设计的建议1) 在验收程序时,尽量体现学生的真实水平,提高验收标准。2) 在查重方面要进一步的加强,不要让偷懒的学生蒙骗过关。 3) 文档的要求再详细一点。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1