huffman算法c语言实验报告,huffman二叉树实验报告--数据结构(c语言).doc

江海强 PAGE 7

数 据 结 构 作 业 报 告

——Huffman二叉树实验报告

姓名:江海强

班级:070921班

学号上机时间:2010-

报告时间:2010-10-26

摘要

1.实验目的

本实验是为了让我们深入了解Huffman二叉树,学会使用Huffman编码对数据进行无损压缩,最终能够灵活运用Huffman二叉树。

2.实验方法

利用递归的方法创建Huffman二叉树,且利用了二叉树的性质对字符串进行编码和译码。

3.实验结果

此程序是在C++环境中运行的。由后面的运行出来的结果且由验证解码的结果可以得知,此程序是正确无误的。由此我们还可以看出利用Huffman编码可以大大节省空间复杂度。

内容

一.问题重述

设计一个程序,首先读入一个ASCII文件,统计文档中字符出现的频度,并根据频度对每个字符生成Huffman编码。需要打印出原始数据、每个字符对应的Huffman编码以及原文档的Huffman编码。还要按照Huffman树对编码后的数据进行解码且验证解码的结果。最后输出一些统计数据,如总编码长度、编码效率等。

二.算法描述

本程序除了运用一些条件语句,判断语句之外,主要是运用了二叉树的性质来设计程序的。

本程序利用二叉树来设计二进制的前缀编码。约定了左分支表示字符'0',右分支表示字符'1',则可以从根结点到叶子结点的路径上分支字符组成的字符串作为该叶子结点字符的编码。

假设每种字符在输入的字符串中出现的次数为,其编码长度为,字符串中只有n种字符,则字符串总长为(即二叉树上带权路径的长度):

WPL =

当输入字符串jiang_hai_qiang时,

即可建立Huffman树,如下面两表所示,

根据此3表可以建立如右图①的Huffman

二叉树的结构图

32221例如n的频率为2,q的频率为1,

这两个结点的共同parent结点的频率为图①1

图①

2+1=3。

编码表:

编码表:

编码频率:

编码长度:

编码表:

编码频率:

编码长度:

j:1110

1

4

g:100

2

3

i:110

3

3

_:101

2

3

a:00

3

2

h:1111

1

4

n:010

2

3

q:011

1

3

表1

num

num

weight

parent

lchild

rchild

1

1

9

0

0

2

3

12

0

0

3

3

13

0

0

4

2

10

0

0

5

2

11

0

0

6

2

11

0

0

7

1

9

0

0

8

1

10

0

0

9

2

12

1

7

10

3

13

4

8

11

4

14

5

6

12

5

14

2

9

13

6

15

3

10

14

9

15

11

12

15

15

0

13

14

表2

由此可以算出WPL=2×3+3×(3+2+2+2+1)+4×(1+1)=42。

开始

开始

输入一串字符数组,用m来记录字符串个数,n来记录

输入一串字符数组,用m来记录字符串个数,n来记录字符串中不同字符的个数。

用for语句把不同字符赋值给数组b[]

用for语句把不同字符赋值给数组b[]。

结束

结束

调用函数Calculate(),

调用函数Calculate(),

计算不同字符的个数,

并把结果赋值给A[]。

最后调用

最后调用HuffmanDecoding(),对输入的二进制编码进行解码。

调用HuffmanCoding(),

调用HuffmanCoding(),构造Huffman二叉树HT,并求出Huffman编码HC。首先对前n个结点初始化,也对n+1到2n-1个结点初始化。调用Select()构建Huffman二叉树;还读出ASCII1文件,并且求出了每个字符的Huffman编码。

调用SC_HuffmanCoding(),输出Huffman编码

调用

调用函数ASCII2(),读出ASCII2文件

三.变量说明

全局变量A[]是用来存储字符的权值的。

weight代表的是该结点的权值。

程序中有m=2*n-1,是为Huffman二叉树开辟2n-1个结点。

在主函数中,m是用来记录输入字符串的个数的;n是用来记录有多少种字符的;a[]则是完整地记录输入的字符串;而b[]是记录输入字符串中的不同字符。

HT表示Huffman树;而HC表示Huffman编码。

其中还要说明的一些C++语句:如cout<>a代表的输入语句;outfile<

四.函数与思路说明

此程序有1个主函数和7个子函数。其中子函数分别为Calculate(),Select(),ASCII1(),ASC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《炉石传说》建筑设计欣赏(7):采用Google.ProtocolBuffers处理网络消息

这一次&#xff0c;琢磨了一下Unity3D网络游戏发展的网络信息处理。服务器的网络游戏一般都是自主研发&#xff0c;因此&#xff0c;相应的网络消息处理应该培养自己。client/现在使用的邮件服务器之间的价差JSON和Google.ProtocolBuffers有两种常见的方法。平炉码看其处理。代…

tarjan算法c语言,tarjan算法板子 - osc_e45irv7l的个人空间 - OSCHINA - 中文开源技术交流社区...

无向图概念时间戳\(dfn[x]\),在深度优先遍历中&#xff0c;按照每个节点第一次被访问的顺序&#xff0c;依次做整数标记追溯值\(low[x]\),通过非搜索边能到达的最小时间戳割边判定法则无向边\((x,y)\)是割边/桥&#xff0c;当且仅当存在x的一个子节点满足\(dfn[x] < low[y]\…

流和文件

流&#xff1a;流是数据的传输方式&#xff1b;C程序处理一个流而不是直接处理文件。你声明一个FILE *fp &#xff0c;并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头&#xff0c;当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头&…

小球进盒子C语言,N个小球放进M个盒子算法-Go语言中文社区

N个小球放入M个盒子共有多少种方法&#xff0c;并输出的算法设计&#xff1a;算法思路1 &#xff1a;暴力填充盒子每个小球都可能放入M个盒子的任意一个&#xff0c;所以直接根据小球个数做递归即可,然后将存储放入hash中排重//TODO算法思路2 &#xff1a;递归填充盒子即&#…

r语言c5.0要求因子输出,R语言中因子的创建与使用

原标题&#xff1a;R语言中因子的创建与使用因子在R语言中可以用来表示名义型变量或有序变量。名义变量一般表示类别&#xff0c;如性别&#xff0c;种族等等。有序变量是有一定排序顺序的变量&#xff0c;如职称&#xff0c;年级等等。在R语言中&#xff0c;名义变量和有序变量…

WinForm中使用AnyCAD三维控件 の 初始化

在WinForm中可以方便的集成AnyCAD.Net三维控件&#xff0c;只需要以下几部即可完成。 一、添加DLL程序集 AnyCAD.Foundation.Net.dll AnyCAD.Presentation.Net.dll AnyCAD.Exchange.Net.dll 二、初始化控件 1.首先创建一个窗体 2.在窗体上放置一个Panel用来放置三维控件 3.初始…

linux中nodejs后台运行工具forever

forever让nodejs应用后台执行 命令如下&#xff1a; forever start ./bin/www nodejs一般是当成一条用户命令执行的&#xff0c;当用户断开客户连接&#xff0c;运用也就停了&#xff0c;很烦人。如何让nodejs应用当成服务&#xff0c;在后台执行呢&#xff1f; 最简单的办法(不…

android启动其他app的服务器,Android中通过外部程序启动App的三种方法

这篇文章主要介绍了Android中通过外部程序启动App的三种方法,本文讲解了直接通过包名、通过自定义的Action、通过Scheme三种方法,并分别给出操作代码,需要的朋友可以参考下第一种&#xff1a;直接通过包名&#xff1a;复制代码 代码如下:Intent LaunchIntent getPackageManage…

linux date 天之前,linux date命令前后几天的推导

linux date使用(前后几天时间推导)在Linux系统 中&#xff0c;可以采用如下方法&#xff1a;1) 取之前的时间&#xff1a;date -d "a day ago" %Y%m%d 取出前1天的系统时间date -d "2 days ago" %Y%m%d 取出前2天的系统时间2) 取之后的时间&#xff1a;dat…

各种封装——封装getClass

因为用Class获取元素时&#xff0c;有兼容性问题&#xff0c;需要分情况获取 显示判断是否可以用getElementsByClassName&#xff0c;若是不介意用就要先获取全部的元素&#xff0c;在用正则判断 function getClass(oParent,sClass){if(oParent.getElementsByClassName){return…

android提示程序正在执行,Android中获取正在运行的进程(一)

关于android中应用程序正在运行的进程有下面几种&#xff1a;1-包含services的进程&#xff0c;2-不包含services的进程&#xff0c;3-杀死应用时有些进程被init回收(类似于僵尸进程)&#xff0c;ppid变为1&#xff0c;无法通过android 应用层代码获得的进程。这些进程可能是应…

jta 知识

JTA知识&#xff08;转载原文地址&#xff1a;http://blog.csdn.net/it_man/article/details/7230215&#xff09; Java Transaction API&#xff0c;译为Java事务API。JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JTA主要用于分布式…

android l usb调试,你居然还不会手机usb调试?5个方法,让你轻松学会设置!

原标题&#xff1a;你居然还不会手机usb调试&#xff1f;5个方法&#xff0c;让你轻松学会设置&#xff01;最近有位朋友将手机连接电脑的时候&#xff0c;遇到了提示打开手机的USB调试模式&#xff0c;却不知道怎么操作。其实&#xff0c;不同手机的usb调试打开的方式都会有所…

深入沟通的重要性——《大道至简》第四章读后感

我们都知道&#xff0c;一个新发明如果不被人们所需要&#xff0c;那只是一个失败品。一篇文章的观点如果不被人们所接受&#xff0c;那么就算文笔再好&#xff0c;也只是一张废纸。同样的&#xff0c;一个与客户需求不符的程序&#xff0c;哪怕它的架构再好&#xff0c;都只是…

鸿蒙os芯片,没有了芯片,华为能靠鸿蒙OS系统打出差异化吗?

原标题&#xff1a;没有了芯片&#xff0c;华为能靠鸿蒙OS系统打出差异化吗&#xff1f;华为今天要和大家说的手机产品是华为&#xff0c;在目前的市场中&#xff0c;华为手机的影响力是非常大的&#xff0c;并且获得了十分不错的销量&#xff0c;甚至在最近一段时间销量超过三…

html5 canvas 不兼容safari浏览器_HTML5简介

HTML5 是继 HTML4.01 和 XHTML1.0 之后的超文本标记语言的最新版本。它是由一群自由思想者组成的团队设计出来&#xff0c;并最终实现多媒体支持、交互性、更加智能的表单&#xff0c;以及更好的语义化标记。HTML5 并不仅仅是 HTML 规范的最新版本&#xff0c;而是一系列用来制…

html5置顶标签css样式,html5 header标签 html header css布局教程 /header

在HTML5版本之前习惯使用div标签布局网页&#xff0c;在HTML5在DIV标签基础上新增header标签元素。也叫“”头部标签。以前我们在div css布局中常常把网页大致分为头部、内容、底部。对于大结构我们常常使用div里加id进行布局。而头部常常使用正应为大家公认html布局中对“head…

DML数据操作语言练习

--创建表T_HQ_BM2 --create table t_hq_bm2 as select * from t_hq_bm; commit;--添加行内容 --insert into t_hq_bm2 values (107,研发部,147258369); commit;--删除部门编码为107的行 --delete t_hq_bm2 where bumenbm 107; commit;--添加行内容 --insert into t_hq_bm2 (bu…

第八届育才杯机器人比赛_赛场、名单公布!南海区第八届“献血者杯”羽毛球公开赛“羽”你相约本周六...

主办单位&#xff1a;南海区献血办、南海血站协办单位&#xff1a;南海区羽毛球协会为进一步扩大无偿献血宣传&#xff0c;感恩南海区献血者&#xff0c;活跃无偿献血者的文体生活&#xff0c;打造一个南海区无偿献血者交流的平台&#xff0c;共同营造“运动、健康、献血、快乐…

2021届安徽高考成绩查询,安徽2021年高考成绩什么时候公布

据安徽省教育招生考试院透露&#xff0c;安徽预计将于6月23日公布各批次录取分数线、考生成绩。2021年安徽高考成绩查询入口2021年高考录取方法1、普通高校的招生录取工作在教育部和省高校招生委员会的领导下&#xff0c;由省考试院组织实施。2、省高校招生委员会根据当年高校在…