(精选)哈夫曼树及其操作-数据结构实验报告

上传人:W**** 文档编号:147912802 上传时间:2020-10-14 格式:DOC 页数:13 大小:133.50KB
返回 下载 相关 举报
(精选)哈夫曼树及其操作-数据结构实验报告_第1页
第1页 / 共13页
(精选)哈夫曼树及其操作-数据结构实验报告_第2页
第2页 / 共13页
(精选)哈夫曼树及其操作-数据结构实验报告_第3页
第3页 / 共13页
(精选)哈夫曼树及其操作-数据结构实验报告_第4页
第4页 / 共13页
(精选)哈夫曼树及其操作-数据结构实验报告_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《(精选)哈夫曼树及其操作-数据结构实验报告》由会员分享,可在线阅读,更多相关《(精选)哈夫曼树及其操作-数据结构实验报告(13页珍藏版)》请在金锄头文库上搜索。

1、电 子 科 技 大 学实 验 报 告 课程名称: 数据结构与算法 学生姓名: 陈*浩 学 号: * 点名序号: * 指导教师: 钱* 实验地点: 基础实验大楼 实验时间: 2015.5.7 2014-2015-2学期 信息与软件工程学院实 验 报 告(二)学生姓名:陈*浩 学 号:* 指导教师:钱*实验地点: 科研教学楼A508 实验时间:2015.5.7一、实验室名称:软件实验室 二、实验项目名称:数据结构与算法树三、实验学时:4四、实验原理:霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法。1952年,David A. Huffman在

2、麻省理工攻读博士时所发明的。在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。例如,在英文中,e的出现机率最高,而z的出现概率则最低。当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个比特。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多

3、。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+.+Wn*Ln),N个权值Wi(i=1,2,.n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,.n)。可以证明霍夫曼树的WPL是最小的。五、实验目的:本实验通过编程实现赫夫曼编码算法,使学生掌握赫夫

4、曼树的构造方法,理解树这种数据结构的应用价值,并能熟练运用C语言的指针实现构建赫夫曼二叉树,培养理论联系实际和自主学习的能力,加强对数据结构的原理理解,提高编程水平。六、实验内容:(1)实现输入的英文字符串输入,并设计算法分别统计不同字符在该字符串中出现的次数,字符要区分大小写;(2)实现赫夫曼树的构建算法;(3)遍历赫夫曼生成每个字符的二进制编码;(4)显示输出每个字母的编码。七、实验器材(设备、元器件):PC机一台,装有C或C+语言集成开发环境。八、数据结构与程序:/* * *程序名称:哈夫曼树的相关操作 * * *程序内容:生成哈夫曼树及其编码表、对字符串进行编码等 * * *编写作者:

5、陈家浩 * * *完成时间:2015.5.15 * */#include #include #include #define MAXSIZE 10000char file_address100; /全局通用文件地址typedef struct hnode / 哈夫曼树的节点结构定义 int weight; int lchild, rchild, parent;THNode, * TpHTree;typedef struct huffman_code / 哈夫曼编码表的元素结构定义 int weight; / 编码对应的权值 char * pcode; / 指向编码字符串的指针THCode, *

6、TpHcodeTab;/*/ * *声明函数/*TpHcodeTab build_codesheet( TpHTree pht, int leaves_num); / 根据哈夫曼树得到编码表TpHTree create_huffman_tree(int weights, int n ); / 构造哈夫曼树void select_mintree(TpHTree , int , int *, int *); / 从森林中选择权值最小的两棵子树void destroy_codesheet(TpHcodeTab codesheet, int n); / 销毁哈夫曼编码表int read_file(ch

7、ar file_address100, char *message); / 从文本文件读入字符串 int calc_freq(char text, int *freq, char *dict, int n); / 统计字符串text中字符出现的频率/*/ * *主函数/*int main(void)int i, msg_num,choose;char s; /清空缓存int leaves_num = 0;doTpHTree pht = NULL; /建立树根TpHcodeTab codesheet; /建立编码表char msgMAXSIZE; /建立信息数组int *weights = NU

8、LL; /建立频率数组char *dict = NULL; /建立字符数组printf( - n-哈夫曼树-n - );printf(n读取文件还是手动输入信息?n 1:手动输入信息n 2:读取文件n 请选择:);scanf(%d,&choose);if(choose = 1)printf(请输入信息:n);scanf(%c,&s); /清理键盘缓存gets(msg);msg_num = strlen(msg);elseprintf(输入文件地址(例如:F:filename.txt):n);scanf(%c,&s); /清理键盘缓存gets(file_address); /输入文件地址msg_

9、num = read_file( file_address, msg); /读取文本文件leaves_num = calc_freq( msg, &weights, &dict, msg_num );/统计文本串中的字符频率,同时得到哈夫曼树的叶节点数pht = create_huffman_tree( weights, leaves_num ); /创建哈夫曼树codesheet = build_codesheet( pht, leaves_num ); /构造哈夫曼编码表printf(n-字符频率编码表-n);printf(符号 - 频率 - 编码n);for(i = 0; i leave

10、s_num ; i+)printf(%4c - %-3d - %-6sn, dicti, codesheeti.weight, codesheeti.pcode);printf(-n);destroy_codesheet( codesheet, leaves_num); /销毁哈夫曼编码表if(pht)/释放所有临时空间free(pht);if(dict)free(dict);if(weights)free(weights);printf(nt0:结束nt1:继续nt请选择:);scanf(%d,&choose);while(choose);return 0;/*/ * *构造哈夫曼编码表/*TpHcodeTab build_codesheet( TpHTree pht, int leaves_num )int i, cid, pid, cursor, len;TpHcodeTab sheet;char * pch = (char *) malloc( leaves_num + 1 );if( !pch )printf(申请空间失败!);exit(0);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号