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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

赫夫曼编译码器的实现数据结构课程设计报告.docx

1、赫夫曼编译码器的实现数据结构课程设计报告数据结构课程设计报告题 目:赫夫曼编/译码器的实现学生姓名: 学 号: 所在学院: 班 级: 指导教师: 职 称: 2010年 6 月 25日 XXX学院本科学生课程设计任务书题目哈夫曼编译码器1、课程设计的目的1) 使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。2) 使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。3) 使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)

2、问题描述:哈夫曼编译码器基本要求: 1.初始化,键盘输入字符集大小n,n个字符和n个权植,建立哈夫曼树。2.编码,利用建好的huffman树生成huffman编码;3.输出编码;4.译码功能;5.字符和频度如下: 字符 空格 A B C D E F G H I J K L M N O P Q 频度 186 64 13 22 32 103 21 15 47 57 1 2 32 20 57 63 15 1 字符 R S T U V W X Y Z 频度 48 51 80 23 8 18 1 163、主要参考文献1刘大有等,数据结构(C语言版),高等教育出版社2严蔚敏等,数据结构(C语言版),清华大

3、学出版社3William Ford,William Topp,Data Structure with C+清华大学出版社4苏仕华等,数据结构课程设计,机械工业出版社4、课程设计工作进度计划第1天 完成方案设计与程序框图 第2、3天 编写程序代码第4天 程序调试分析和结果第5天 课程设计报告和总结指导教师(签字)日期年 月 日教研室意见:年 月 日学生(签字): 接受任务时间: 2010年6 月25 日课程设计(论文)指导教师成绩评定表题目名称哈夫曼编译码器评分项目分值得分评价内涵工作表现20%01学习态度6遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。02科学实践、调研7通过实验、试验、

4、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。03课题工作量7按期圆满完成规定的任务,工作量饱满。能力水平35%04综合运用知识的能力10能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。05应用文献的能力5能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。06设计(实验)能力,方案的设计能力5能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。07计算及计算机应用能力5具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处

5、理和辅助设计等。08对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)10具有较强的数据收集、分析、处理、综合的能力。成果质量45%09插图(或图纸)质量、篇幅、设计(论文)规范化程度5符合本专业相关规范或规定要求;规范化符合本文件第五条要求。10设计说明书(论文)质量30综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。11创新10对前人工作有改进或突破,或有独特见解。成绩指导教师评语指导教师签名: 年月日摘要利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收

6、端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统,试为这样的信息收发站写一个哈夫曼编译码系统。关键字:数据结构、哈夫曼编码目录第一章. 序言 1第二章问题分析与说明 1一功能分析 1二问题描述与说明 1第三章程序总体设计 2一设计思路及方案 2二.设计的总体框架 3第四章.详细算法与设计 5一实现算法流程图 5二哈夫曼编码的算法 6三文件的编码和解码 8第五章.程序调试与运行结果 8第六章.课程设计总结 9第七章.参考文献 10第八章.附录 11第一章. 序言目的:1、为了使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、

7、存储结构和操作实现算法,以及它们在程序中的使用方法。2、 为了使学生掌握软件设计的基本内容和设计方法,并培养学生进行规化软件设计的能力。3、为了使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。意义:通过数据结构课程设计,我掌握了赫夫曼编/译码器的实现所需要的各种知识,了解到了哈夫曼程序设计的基本原理和知识,我相信在以后的学习当中我会更加的喜欢计算机这门高新技术学科。第二章问题分析与说明一功能分析利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)

8、。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编译码系统。因此为这样的信息收发站写一个哈夫曼码的编译码系统存在着相当大的必要。相关知识:数据结构、哈夫曼编码译码器、程序设计格式等。二问题描述与说明:1.数据结构主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。2. 哈夫曼编码的应用很广

9、泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。作为信息管理专业的学生,我们应该很好的掌握这门技术。在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。3. 课程设计题目:哈夫曼编译

10、码器任务和功能:(1)从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树的存储结构;(2)利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对给定的n个字符正文进行编码,并输出结果。(3)利用已建好的哈夫曼树,对给定的一个哈夫曼编码进行译码,判断此编码对应的字符,并输出结果。4.问题分析该问题要求将输入的字符以及相应的权值建立哈夫曼树,并利用建好的哈夫曼树生成哈夫曼编码。把输入的字符按权值从小到大排序,挑出2个最小权值供哈夫曼编码调用,再将输入的字符以及他的权值,按照哈夫曼规则建立二叉树,从叶子到根逆向求编码,再使用循环,从根结点开始遍历输出。第三章程序总体设计一设

11、计思路及方案1.哈弗曼树的构造根据哈夫曼树的定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶结点越靠近根结点,而权值越小的叶结点越远离根结点。这种方法的基本思想是: (1)由给定的n个权值W1,W2,Wn构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合FT1,T2,Tn; (2)在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树,这棵新的二叉树根结点的权值为其左、右子树根结点权值之和; (3)在集合F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到集合F中;(4)重复(2)(3)两步,当F中只剩下一棵二叉树时,这棵二叉树便是所要建立的哈夫曼树。

12、2.哈弗曼编码 设S=d0,d1,d(n-1)为待编码的字符集,W=w0,w1,w(n-1)是S中各字符在电文中出现的频率。现以W为权值,构造哈弗曼树。哈弗曼的每个叶子结点对应一个字符。在哈弗曼树的每个结点到其左孩子的边上标上0,到其右孩子的边上标上1。将从根的每个叶子的路径上的数码连接起来,就是该叶子所代表的字符编码。因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。3.哈弗曼译码译码过程为:自左向右逐一扫描码文,并从哈弗曼树的根开始,将扫描得到的二进制位串中的相邻位于哈弗曼树上标的0,1相匹配,以确定一条从跟到叶子结点的路径,

13、一但到达叶子,则译出了一个字符;再回到树根,从二进制的下一位开始继续译码4.该系统将实现以下几大功能:从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树的存储结构;利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对给定的n个字符正文进行编码,并输出结果。利用已建好的哈夫曼树,对给定的一个哈夫曼编码进行译码,判断此编码对应的字符,并输出结果。二.设计的总体框架第四章.详细算法与设计一实现算法流程图1.建立HuffmanTreevoid HaffmanTree:Haffman(int weight,HaffmanTree HT)查找哈夫曼链表中两个权值最小的节点: 创

14、建哈弗曼树2.哈夫曼编码和译码(略)二哈夫曼编码的算法 给定字符集的哈夫曼树生成后,求哈夫曼编码的具体实现过程是:依次以叶子Ti(0in-1)为出发点,向上回溯至根为止。上溯时走左分支则生成代码0,走右分支则生成代码1。 注意: 由于生成的编码与要求的编码反序,将生成的代码先从后往前依次存放在一个临时向量中,并设一个指针start指示编码在该向量中的起始位置(start初始时指示向量的结束位置)。 当某字符编码完成时,从临时向量的start处将编码复制到该字符相应的位串bits中即可。 因为字符集大小为n,故变长编码的长度不会超过n,加上一个结束符0,bits的大小应为n+1。 (2)字符集编

15、码的存储结构及其算法描述 typedef struct char ch; /存储字符 char bitsn+1; /存放编码位串 CodeNode; typedef CodeNode HuffmanCoden; void CharSetHuffmanEncoding(HuffmanTree T,HuffmanCode H) /根据哈夫曼树T求哈夫曼编码表H int c,p,i;/c和p分别指示T中孩子和双亲的位置 char cdn+1; /临时存放编码 int start; /指示编码在cd中的起始位置 cdn=0; /编码结束符 for(i=0,i=0)/直至上溯到Tc是树根为止 /若Tc是

16、Tp的左孩子,则生成代码0;否则生成代码1 cd-start=(Tp).1child=C)?0:1; c=p; /继续上溯 strcpy(Hi.bits,&cdstart); /复制编码位串 /endfor /CharSetHuffmanEncoding三文件的编码和解码 (略)第五章程序调试与运行结果运行结果图:运行结果分析:通过调试发现该程序满足哈弗曼树,哈弗曼编码的基本要求,满足课程设计任务的基本功能与要求。但是,该程序还是有所欠缺和不足,不能通过编码译出电文。在以后的学习中希望能将其实现,使程序变得更完善。第六章课程设计总结通过一周的课程设计使我对哈夫曼树以及哈夫曼编码有了更深的认识和

17、理解,也使我更加明白哈夫曼编码译码在信息技术中的重要性和地位。 通过对数据结构和课程设计的学习,使我们能够以问题求解方法、程序设计方法以及一些典型的数据结构算法为研究对象,分析数据对象的特征,掌握数据组织的方法和在计算机中的表示方法,为数据选择适当的逻辑结构、存储结构以及相应的处理算法,使我们初步掌握了算法的时间、空间复杂度的分析技巧,并逐步培养了良好的程序设计风格以及进行复杂程序设计的技能。数据结构一科的重要内容和主要难点是让我们理解、习惯和熟悉算法构造性思维方法。在课设过程中,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,构建最小代价生成树时,一个细微的循

18、环控量的错误都能影响到程序的正确性,而所有的代码机制都是为一个目标的实现而运作的,所以,细致是实现算法和程序准确性必不可少的。许多的错误让我明白了一个道理-细心是非常重要的。同时,对于编程者而言,思路清晰是相当重要的。在适当的时候和同学一起交流探讨是一个十分好的学习机会。请教老师也很重要,因为毕竟我们是新手,对于某些问题很难弄清楚。而且,某些错误对于我们来说有时候想半天都弄不来,但老师几下下就搞好了,这样就更加有效地节约了时间。做课程设计不仅让我修补了以前学习的漏洞,也让我知道一个道理:编程需要兴趣和实际动手。这应该可以借鉴在老师的教学工作上。创新思维至关重要,这不仅能让我们写出精简的代码,也

19、有助于开发出高效的程序。第七章.参考文献1数据结构(C语言版),刘大有等,高等教育出版社2数据结构(C语言版),严蔚敏等,清华大学出版社3C语言程序设计(第二版),谭浩强、张温基等编著,高等教育出版社4数据结构课程设计,苏仕华等,机械工业出版社5C+面向对象程序设计,谭浩强编著,清华出版社,中国铁道出版社6C程序设计语言,徐宝文 李志等著,机械工业出版社7C和指针,徐波译,人民邮电出版社8C陷阱与缺陷,高巍译,人民邮电出版社9C专家编程,徐波译,人民邮电出版社10实用C语言编程,郭大海译,中国电力出版社11C语言核心技术,蔡学镛译,机械工业出版社第八章附录源程序:#include#includ

20、e#includeusing namespace std;const int MaxValue = 10000; class HaffmanTree public: HaffmanTree(int n); HaffmanTree(); HaffmanTree(); void Haffman(int weight,HaffmanTree HT); void HaffmanCode(HaffmanTree haffTree,HaffmanTree HaffCode,char ch,string s); private: int weight; /权值 int flag; /标记 int paren

21、t; /双亲结点下标 int leftChild; /左孩子下标 int rightChild; /右孩子下标 int bit6; /数组 int start; /编码的起始下标 int N;HaffmanTree:HaffmanTree(int n) N=n;HaffmanTree:HaffmanTree() HaffmanTree:HaffmanTree() void HaffmanTree:Haffman(int weight,HaffmanTree HT) int j, m1, m2, x1, x2; /哈夫曼树haffTree初始化。n个叶结点的哈夫曼树共有2n-1个结点 for(i

22、nt i = 0; i 2 * N - 1 ; i+) if(i N) HTi.weight = weighti; else HTi.weight = 0; HTi.parent = 0; HTi.flag = 0; HTi.leftChild = -1; HTi.rightChild = -1; /构造哈夫曼树haffTree的n-1个非叶结点 for(i = 0;i N-1;i+) m1 = m2 = MaxValue; x1 = x2 = 0; for(j = 0; j N+i;j+) if(HTj.weight m1 & HTj.flag = 0) m2 = m1; x2 = x1;

23、m1 = HTj.weight; x1 = j; else if(HTj.weight m2 & HTj.flag = 0) m2 = HTj.weight; x2 = j; /将找出的两棵权值最小的子树合并为一棵子树 HTx1.parent = N+i; HTx2.parent = N+i; HTx1.flag = 1; HTx2.flag = 1; HTN+i.weight = HTx1.weight+HTx2.weight; HTN+i.leftChild = x1; HTN+i.rightChild = x2; void HaffmanTree:HaffmanCode(HaffmanT

24、ree haffTree, HaffmanTree HaffCode,char ch,string s) int child, parent; string cs; for(int i = 0; i N; i+) start = N-1; /不等长编码的最后一位为n-1 weight = haffTreei.weight; /取得编码对应权值的字符 child = i; parent = haffTreechild.parent; /由叶结点向上直到根结点 while(parent != 0) if(haffTreeparent.leftChild = child) bitstart = 0;

25、 /左孩子结点编码0 else bitstart = 1; /右孩子结点编码1 start-; child = parent; parent = haffTreechild.parent; /保存叶结点的编码和不等长编码的起始位 for(int j = start+1; j N; j+) HaffCodei.bitj = bitj; HaffCodei.start = start; HaffCodei.weight = weight; /记住编码对应权值的字符 coutsetw(16)权值setw(11)编码endl; for(i = 0; i N; i+) coutsetw(5)chiset

26、w(10)HaffCodei.weightsetw(10); for(int j = HaffCodei.start+1; j N; j+) cout HaffCodei.bitj; cout endl; system(pause); cout进行译码:; for(i=0;is.size();i+) for(int j=0;jN;j+) if(si=chj) for(int m = HaffCodej.start+1; m N; m+) cout HaffCodej.bitm; coutendl;void main(void) int m,q; char p; string str,ch; c

27、outm; int weight26; char node26; for(int i=0;im;+i) cout请输入第i+1p; nodei=p; coutq; weighti=q; system(pause); coutstr; HaffmanTree h(m); HaffmanTree *myHaffTree = new HaffmanTree2*m+1; HaffmanTree *myHaffCode = new HaffmanTreem; h.Haffman(weight , myHaffTree); h.HaffmanCode(myHaffTree, myHaffCode,node,str);

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

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