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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

哈夫曼编码数据结构C++程序.docx

1、哈夫曼编码数据结构C+程序数据结构课程设计一、目的数据结构是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。二、要求通过这次设计,要求在数据结构析逻辑特性和物理表示,数据结构的选择的应用、算法的设计及其实现等方面中深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。三、内容2.哈夫曼编码/译码器【问题描述】设计一个利用哈夫曼

2、算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。【基本要求】(1)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;(2)编码:利用建好的哈夫曼树生成哈夫曼编码;(3)输出编码;(4)设字符集及频度如下表:字符 空格 A B C D E F G H I J K L M频度 186 64 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 1 【选做内容】(1)译码功能;(2)显示哈夫曼树;(3)界面设计的优化。哈夫曼编

3、写编译码一、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,这要求在发送端通过一个编码系统对待传输预先编码,在接收端将传来的数据进行译码。对于双工通道,每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。二、概要设计1哈夫曼树的定义:在一棵二叉树中,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。2哈夫曼树的构造:假设有N个权值,则构造出的哈夫曼树有N个叶子结点。N个权值分别设为W1,W2,.Wn,则哈夫曼树的构造规则为: (1)将W1,W2,.Wn看成有N棵树的森林;(2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左,右

4、子树,且新树的根结点为其左,右子树结点权值之和;(3)从森林中删除选取取的两面三刀棵树,并将新树加入森林;(4)重复(2)(3)步,直到森林中只剩一棵树为止,该树即为我们所求得的哈夫曼树。在构造哈夫曼树的过程中,每次由两棵权值最小的树生成一棵新树时,新树的左子树和右子树可以任意安排,这样将会得到具有不同结构的多个哈夫曼树,但字们都具有相同的带权路径长度。为了歙得到的哈夫曼树的结构尽量唯一,通常规定生成的哈夫曼树中每个结点的左子树根结点的权要小于等于右女树根结点的权。3构造哈夫曼树的算法实现:假设哈夫曼树采用双亲孩子表示法存储,并增加权值域,构造哈夫曼树的叶子结点(树木的权)有N个,合并次数为N

5、1次,则森林中总共有2N1棵树,(包含合并后删除的)。存储结构描述为: const int n=maxn /maxn表示叶子数目 const int m=2*n-1 /m为森林中树的棵数 class tree public: float weight; /权值 int parent; /双亲 int lch, rch; /左,右孩子 tree hftreem+1; /规定从第一个元素hftree1开始使用数组元素,故定义长度为m+1而不为m4结构类型:typedef structchar data;int weight;int parent;int lchild;int rchild;huff

6、node;typedef struct char cdMAX; int start;huffcode;5主程序int main() 初始化:输入字符代码以及权值. 编制哈夫曼码:根据权值建立二叉树, 输出相应的根节点到叶结点的路径,便是哈夫曼编码.编码:输入字符,输出哈夫曼码.译码:输入哈夫曼,输出字符代码.退出:结束进程,退出程序.return 0;三、详细设计#include#include#include#define MAX 25typedef struct char data; int weight; int parent; int lchild; int rchild; HTNod

7、e;typedef struct char cdMAX; int start; HuffmanCode;int main() HTNode ht2*MAX; HuffmanCode hcdMAX, d; int i, k, f, l, r, n, c, s1, s2; cout* * * * * * * * * * * * * * * * * * * * * n t哈夫曼编码与译码系统n * * * * * * * * * * * * * * * * * * * * * n; coutn; cout请输入各个元素的结点值与权值:n; for(i=1;i=n;i+) cout 第int结点值:;

8、 cin&hti.data; couthti.weight; for(i=1;i=2*n-1;i+) hti.parent=hti.lchild=hti.rchild=0; for(i=n+1;i=2*n-1;i+) s1=s2=32767; l=r=0; for(k=1;k=i-1;k+) if(htk.parent=0) if(htk.weights1) s2=s1; r=l; s1=htk.weight; l=k; else if(htk.weights2) s2=htk.weight; r=k; htl.parent=i; htr.parent=i; hti.weight=htl.we

9、ight+htr.weight; hti.lchild=l; hti.rchild=r; for(i=1;i=n;i+) d.start=n+1; c=i; f=hti.parent; while(f!=0) if(htf.lchild=c) d.cd-d.start=0; else d.cd-d.start=1; c=f; f=htf.parent; hcdi=d; cout输出哈夫曼编码:n; for(i=1;i=n;i+) couthti.data: ; for(k=hcdi.start;k=n;k+) couthcdi.cdk; coutn; l: couthfm; if(hfm=e)

10、 return 0; else switch(hfm) caseb: int q ; char bs; coutn* * * 哈夫曼编码 * * *n; cout请输入字符代码: endl; for(q=0;bs!=10;q+) bs=getchar(); for(i=1;i=n;i+) if (bs=hti.data) for(k=hcdi.start;k=n;k+) couthcdi.cdk; coutendl; break; casey: char e; int t,u; t=2*n-1; coutn* * * 哈夫曼译码 * * *n; coutn请输入哈夫曼码: endl; for(

11、u=0;e!=10;u+) if(htt.lchild!=0) e=getchar(); if(e=0) t=htt.lchild; else t=htt.rchild; else couthtt.data; t=2*n-1; cout结点植:1权 植:10第2个元素结点植:3权 植:13第3个元素结点植:5权 植:12第4个元素结点植:4权 植:15输出哈夫曼编码:1:003:105:014:11请选择编码/译码/退出系统:y* * * 哈夫曼编码 * * *请输入哈夫曼码:00 1请选择编码/译码/退出系统:b* * * 哈夫曼编码 * * *请输入字符代码: 100请选择编码/译码/退出

12、系统:epress any key to continue 七实验心得在通信中,可以采用0,1的不同排列来表示不同的字符,称为二进制编码。而哈夫曼树在数据中的应用,是数据库的最小冗余编码问题,字是数据压缩学的基础。若每个字符出现的频率相同,则可以采用等长的二进制编码,若频率不同,则可以采用不等长的二进制编码,频率较大的字符采用位数较少的编码,频率较小的字符采用位数较多的编码,这样可以使字符的整体编码长度最小,这就是最小冗余编码问题。而哈夫曼编码就是一种不等长的二进制编码,且哈夫曼树是一种最优二叉树,它的编码也是一种最优编码,在哈夫曼树中,规定往左编码为0,往右编码为1,则得到叶子结点编码为从根

13、结点到叶子结点中所有路径中0和1的顺序排列。为了使不等长编码成为无前缀编码,避免译码时的二义性,可用该字符集中的每个字符作为叶子结生成一棵编码二叉树,为了获得传送电文的最短长度,可以将每个字符的出现频率作为字符结点的权值赋予该结点上,求出此树的最小带权路径长度就等于求出了传送电文的最短长度。因此,求传送电文的最短长度问题就转化为求由集中的所有字符作为叶子结点为,由字符的出现频率作为其权值所产生的哈夫曼权的问题。通过这次的实验我对软件设计有了一定的了解,同时感觉到自己还有很多的不足之处,特别是实际动手能力还有待于提高。在以后的学习中,要勤于思考,多动脑,多动手,这样才能不断提高成绩。附录:程序源

14、代码#include#include#include#define MAX 25typedef struct char data; int weight; int parent; int lchild; int rchild; HTNode;typedef struct char cdMAX; int start; HuffmanCode;int main() HTNode ht2*MAX; HuffmanCode hcdMAX, d; int i, k, f, l, r, n, c, s1, s2; cout* * * * * * * * * * * * * * * * * * * * *

15、n t哈夫曼编码与译码系统n * * * * * * * * * * * * * * * * * * * * * n; coutn; cout请输入各个元素的结点值与权值:n; for(i=1;i=n;i+) cout 第int结点值:; cin&hti.data; couthti.weight; for(i=1;i=2*n-1;i+) hti.parent=hti.lchild=hti.rchild=0; for(i=n+1;i=2*n-1;i+) s1=s2=32767; l=r=0; for(k=1;k=i-1;k+) if(htk.parent=0) if(htk.weights1)

16、s2=s1; r=l; s1=htk.weight; l=k; else if(htk.weights2) s2=htk.weight; r=k; htl.parent=i; htr.parent=i; hti.weight=htl.weight+htr.weight; hti.lchild=l; hti.rchild=r; for(i=1;i=n;i+) d.start=n+1; c=i; f=hti.parent; while(f!=0) if(htf.lchild=c) d.cd-d.start=0; else d.cd-d.start=1; c=f; f=htf.parent; hcd

17、i=d; cout输出哈夫曼编码:n; for(i=1;i=n;i+) couthti.data: ; for(k=hcdi.start;k=n;k+) couthcdi.cdk; coutn; l: couthfm; if(hfm=e) return 0; else switch(hfm) caseb: int q ; char bs; coutn* * * 哈夫曼编码 * * *n; cout请输入字符代码: endl; for(q=0;bs!=10;q+) bs=getchar(); for(i=1;i=n;i+) if (bs=hti.data) for(k=hcdi.start;k=n;k+) couthcdi.cdk; coutendl; break; casey: char e; int t,u; t=2*n-1; coutn* * * 哈夫曼译码 * * *n; coutn请输入哈夫曼码: endl; for(u=0;e!=10;u+) if(htt.lchild!=0) e=getchar(); if(e=0) t=htt.lchild; else t=htt.rchild; else couthtt.data; t=2*n-1; coutendl; break; goto l; return 0; /ZRC

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

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