哈夫曼树构造及哈夫曼编码

182 篇文章 30 订阅
订阅专栏
41 篇文章 9 订阅
订阅专栏

前情提要

请为用于通信的电文中的字母进行赫夫曼编码。如各个字母在电文中出现的频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11。试为这8个字母设计哈夫曼编码。

通信的电文中的字母一般是a,b,c,d,e,f,g,h

根据其出现的概率可设8个字符的权值为:w=(5,29,7,8,14,23,3,11)

将树的左分支标记为0,右分支标记为1,便得到其哈夫曼编码表

代码函数

void CreateHT(HTNode ht[],int n);//构造哈夫曼树
void CreateHCode(HTNode ht[],HCode hcd[],int n);//构造哈夫曼编码
void DispHCode(HTNode ht[],HCode hcd[],int n);//输出哈夫曼编码

代码实现

#include<stdio.h>
#include<string.h>
#define N 50 //叶子节点数
#define M 2*N-1 //树中节点总数
typedef struct
{
	char data[5]; //节点值
	int weight; //权重
	int parent;  //双亲节点
	int lchild;  //左孩子节点
	int rchild;  //右孩子节点
}HTNode;
typedef struct
{
	char cd[N];//存放哈夫曼码
	int start;
}HCode;

void CreateHT(HTNode ht[],int n);//构造哈夫曼树
void CreateHCode(HTNode ht[],HCode hcd[],int n);//构造哈夫曼编码
void DispHCode(HTNode ht[],HCode hcd[],int n);//输出哈夫曼编码

void CreateHT(HTNode ht[],int n)//构造哈夫曼树
{
	int i,k,lnode,rnode;
	int min1,min2;//设置权重最小的两个节点
	for(i=0;i<2*n-1;i++)//所有节点的相关域设置初始值为-1
	{
		ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
	}
	for(i=n;i<2*n-1;i++)//构造哈夫曼树
	{                      //n前面的空间给输入的值,树的其他节点给算出来的权重和
		min1=min2=32767;//min1为第一个最小的权重,min2为第二个最小的权重
		lnode=rnode=-1;//lnode和rnode为最小权重的两个节点位置
		for(k=0;k<=i-1;k++)
			if(ht[k].parent==-1)//只在尚未构造二叉树的节点中查找
			{
				if(ht[k].weight<min1)//找权重最小的两个节点
				{
					min2=min1;rnode=lnode;//把min1的下标值给了min2,原左孩子的下标lnode给右孩子的下标rnode
					min1=ht[k].weight;lnode=k;//把权重最小的下标赋给lnode
				}
				else if(ht[k].weight<min2)
				{
					min2=ht[k].weight;
					rnode=k;//把权重第二最小的下标赋给rnode
				}
			}
			ht[lnode].parent=i;ht[rnode].parent=i;//将当前权重最小的两个的双亲节点设为下标为i的节点
			ht[i].weight=ht[lnode].weight+ht[rnode].weight;//下标为i的节点的权重为两个子女的权重和
			ht[i].lchild=lnode;ht[i].rchild=rnode;//设置下标为i的节点的孩子为下标为lnode和rnode
			//注意,设置为孩子的双亲,还要设置双亲的孩子
	}
}

void CreateHCode(HTNode ht[],HCode hcd[],int n)//构造哈夫曼编码
{
	int i,f,c;
	HCode hc;
	for(i=0;i<n;i++)//根据哈夫曼树求哈夫曼编码
	{
		hc.start=n;c=i;//c获取当前节点的下标
		f=ht[i].parent;//获取输入的叶子节点的双亲节点下标
		while(f!=-1)//循序直到树根节点,树根节点的双亲节点下标为-1
		{
			if(ht[f].lchild==c)//处理左孩子节点,判断当前双亲节点的左孩子是否是节点为c下标,是,就处理
				hc.cd[hc.start--]='0';//hc.start--从当前节点开始标记0/1一直到根节点
			else               //处理右孩子,判断当前双亲节点的右孩子是否是节点为c下标,是,就处理
				hc.cd[hc.start--]='1';
			c=f;f=ht[f].parent;//c获取当前节点的下标,f获得双亲节点下标
		}
		hc.start++;//start指向哈夫曼编码最开始字符,最后一次循环产生作用
		hcd[i]=hc;
	}
}

void DispHCode(HTNode ht[],HCode hcd[],int n)//输出哈夫曼编码
{
	int i,k;
	printf("输出哈夫曼编码:\n");
	for(i=0;i<n;i++)
	{
		printf("       %s:\t",ht[i].data);
		for(k=hcd[i].start;k<=n;k++)
		{
			printf("%c",hcd[i].cd[k]);
		}
		printf("\n");
	}
}

void main()
{
	int n=8,i;
	HTNode ht[M];
	HCode hcd[N];
	char *str[]={"a","b","c","d","e","f","g","h"};
	int fnum[]={5,9,7,8,14,23,3,11};
	for(i=0;i<n;i++)
	{
		strcpy(ht[i].data,str[i]);
		ht[i].weight=fnum[i];
	}
	CreateHT(ht,n);
	CreateHCode(ht,hcd,n);
	DispHCode(ht,hcd,n);
}

输出

 

数据结构:哈夫曼树及其哈夫曼编码
weixin_67035108的博客
06-07 2025
哈夫曼树(Huffman Tree)是一种特殊的二叉树,由David A. Huffman在1952年发明的,用于数据压缩领域。它将每个字符映射为一个唯一的二进制串,这些二进制串的长度不同,且是根据字符出现频率来确定的。频率越低的字符,其编码越长。:从根节点开始,向左子树走标记为0,向右子树走标记为1,直到到达叶节点,此时叶节点对应的字符的路径标记就是其哈夫曼编码。2.从队列中取出两个权重最小的节点,创建一个新的内部节点,其权重为这两个节点权重之和。:所有叶节点的权重乘以其到根节点的距离之和是最小的。
实现哈夫曼编码构造哈夫曼树C语言.zip
11-10
哈夫曼编码实现哈夫曼编码构造哈夫曼树C语言.zip实现哈夫曼编码构造哈夫曼树C语言.zip实现哈夫曼编码构造哈夫曼树C语言.zip实现哈夫曼编码构造哈夫曼树C语言.zip实现哈夫曼编码构造哈夫曼树C语言.zip
数据结构:哈夫曼树的建立与哈夫曼编码的实现
weixin_45888851的博客
07-15 8094
哈夫曼树 哈夫曼树,也称最优二叉树,是数据结构的一个重要内容,实际运用中我们通过哈夫曼编码来大幅度提高无损压缩的比例。 弄清哈夫曼树,我们首先要弄清以下四个概念。 概念1:什么是路径? 在一棵树中,从一个结点到另一个结点所经过的所有结点,被我们称为两个结点之间的路径。 上面的二叉树当中,从根结点A到叶子结点H的路径,就是A,B,D,H。 概念2:什么是路径长度? 在一棵树中,从一个结点到另一个结点所经过的“边”的数量,被我们称为两个结点之间的路径长度。 仍然用刚才的二叉树举例子,从根结点A到叶子结点H,
哈夫曼树构造与编码
x2656271356的博客
10-24 4953
哈夫曼树构造以及编码的实现
数据结构(C语言)-哈夫曼(Huffman)树编码译码操作
qq_44025638的博客
11-17 1万+
huffman树的编码和译码操作
构造哈夫曼树输出哈夫曼编码
weixin_59912996的博客
12-28 1271
1、2、3、4、实现代码。
6-1 哈夫曼树哈夫曼编码
m0_73378369的博客
10-28 556
其中upbound编号,HT是哈夫曼树,HC是哈夫曼编码,w是权值,n是叶子节点个数。
哈夫曼树哈夫曼编码介绍.zip
04-18
总结来说,哈夫曼树哈夫曼编码是优化数据编码的关键工具,它们利用频率信息构造最优化的二叉树结构,并据此生成编码,有效提高了数据存储和传输的效率。在理解和应用这些概念时,掌握其基本原理、构建过程以及与...
基于 C实现哈夫曼编码构造哈夫曼树
最新发布
05-10
在C语言中实现哈夫曼编码构造哈夫曼树涉及以下几个关键步骤: 1. **哈夫曼树的创建**: - 首先,我们需要一个数据结构来存储每个字符及其频率。这通常是一个结构体,包含字符和频率两个字段。 - 接着,创建一个...
4. 哈夫曼树构造、编码与译码.c
03-12
哈夫曼树构造
C++实现构造哈夫曼、哈夫曼编码
qq_44757691的博客
12-09 2313
例:设n=7,w={0.4,0.3,0.15,0.05,0.04,0.03,0.03}构造哈夫曼树,并求哈夫曼编码
数据结构实验-哈夫曼树哈夫曼编码
10-26
一、问题描述 运用哈夫曼算法构造哈夫曼树,并得到哈夫曼编码。 输入格式:10,5,21,18,8,13 二、实验目的 掌握哈夫曼算法。 三、实验内容及要求 1、构造哈夫曼树哈夫曼编码的存储结构。 2、实现哈夫曼算法,实现哈夫曼树的存储并求出哈夫曼编码
哈夫曼编码 课设 数据结构 C
06-22
哈夫曼树及其编码 问题描述: 设计一个利用哈夫曼算法的编码系统,重复地显示并处理以下项目,直到选择退出为止。 基本要求: ⑴初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树; ⑵编码:利用建好的哈夫曼树生成哈夫曼编码; ⑶输出哈夫曼树哈夫曼编码; ⑷设字符集及频度如下表: 字符 空格 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
【Java】构建哈夫曼树输出哈夫曼编码
m0_73520938的博客
12-09 550
一个单位有12个部门,每个部门都有一部电话,但是整个单位只有一根外线,当有电话打过来的时候,由转接员转到内线电话,已知各部门使用外线电话的频率为(次/天):5 20 10 12 8 43 5 6 9 15 19 32。利用哈夫曼树算法思想设计内线电话号码,使得接线员拨号次数尽可能少。要求:(1)依据使用外线电话的频率构造二叉树;(2)输出设计出的各部门内线电话号码。
数据结构实验——哈夫曼树哈夫曼编码应用
FLY_LZL的博客
12-19 557
(5)用Haffman树对文件b中码文进行译码,结果存入文件c中,比较a,c是否一致,以检验编码、译码的正确性。(3)写函数以字母出现次数作权值,建Haffman树(n个叶子),给出每个字母的Haffman编码。(1)输入一段100—200字的英文短文,存入一文件a中。(2)写函数统计短文出现的字母个数n及每个字母的出现次数。(4)用每个字母编码对原短文进行编码,码文存入文件b中。仅作个人实验记录,如有错误还望各位指正。
PTA7-3 构造哈夫曼树 输入一些单词及其出现的频度,构造一棵哈夫曼树输出哈夫曼编码的平均码长。
m0_56143632的博客
11-08 2077
构造哈夫曼树 输入一些单词及其出现的频度,构造一棵哈夫曼树输出哈夫曼编码的平均码长。
构造Huffman树以及对Huffman编码
Akatsuki
12-20 1415
Akatsuki
数据结构:哈夫曼树哈夫曼编码与译码系统
idevede的博客
02-13 1万+
将文本文件利用哈夫曼树进行编码,存储成压缩文件
哈夫曼树哈夫曼编码详解【完整版代码】
热门推荐
wardseptember的博客
06-17 11万+
Huffman Tree简介&amp;amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;amp;nbsp; 赫夫曼树(Huffman Tree),又称最优二叉树,是一类带权路径长度最短的树。假设有n个权值{w1,w2,…,wn},如果构造一棵有n个叶子节点的二叉树,而这n个叶子节点的权值是{w1,w2,…,wn},则所构造出的带权路径长度最小的二叉树就被称为赫夫曼树。&amp;amp;amp;amp;amp;nbsp; &amp;amp;amp;a
构造哈夫曼树,并根据哈夫曼树构造哈夫曼编码
12-15
以下是构造哈夫曼树并根据哈夫曼树构造哈夫曼编码的步骤和示例代码: 1. 统计每个字符出现的频率,并将它们存储在一个字典中。 2. 将每个字符及其频率作为一个节点,构造一个森林。 3. 从森林中选出两个频率最小的节点,将它们合并成一个新节点,并将新节点的频率设置为两个节点的频率之和。将新节点插入森林中。 4. 重复步骤3,直到森林中只剩下一个节点,这个节点就是哈夫曼树的根节点。 5. 根据哈夫曼树构造哈夫曼编码。从根节点开始,遍历哈夫曼树,当遇到左子树时,在编码的末尾添加0,当遇到右子树时,在编码的末尾添加1。当遍历到叶子节点时,就得到了该字符的哈夫曼编码。 以下是示例代码: ```python # 定义节点类 class Node: def __init__(self, freq, char=None): self.freq = freq self.char = char self.left = None self.right = None # 统计字符频率 def count_freq(text): freq = {} for char in text: if char in freq: freq[char] += 1 else: freq[char] = 1 return freq # 构造哈夫曼树 def build_huffman_tree(freq): forest = [Node(freq[char], char) for char in freq] while len(forest) > 1: forest.sort(key=lambda x: x.freq) node1 = forest.pop(0) node2 = forest.pop(0) new_node = Node(node1.freq + node2.freq) new_node.left = node1 new_node.right = node2 forest.append(new_node) return forest[0] # 构造哈夫曼编码 def build_huffman_code(node, code=''): if node.char: print(node.char, code) else: build_huffman_code(node.left, code + '0') build_huffman_code(node.right, code + '1') # 示例 text = 'hello world' freq = count_freq(text) tree = build_huffman_tree(freq) build_huffman_code(tree) ``` 输出结果为: ``` d 00 h 01 r 100 e 1010 w 1011 o 110 l 1110 1111 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • compareTo比较大小 18548
  • 编写程序实现从键盘输入三个整数,输出三个数中的最小数。(使用if关键字) 17448
  • 编写程序实现从键盘输入一个整数,判断该数是奇数还是偶数并输出。 例如:输入13,则应输出odd。(odd奇数,even偶数) 16458
  • localhost基本概念 14299
  • 数据库原理及安全技术教学实验报告SQL实践(一) 13840

分类专栏

  • 取证技术 2篇
  • ENSP 1篇
  • 数据结构(c) 41篇
  • 网络安全 1篇
  • 软件安全 6篇
  • 渗透 5篇
  • 网络技术 4篇
  • C++ 8篇
  • SQL 8篇
  • Linux 4篇
  • cisco 1篇
  • C语言程序设计 182篇
  • 随笔 10篇
  • JavaScript 4篇
  • 逆向工程 1篇
  • 数据情报分析 1篇
  • python 3篇
  • C# 1篇
  • 恶意程序实战分析 9篇
  • 毛中特
  • 计算机组成原理 8篇
  • DOM 1篇
  • Java程序设计基础 98篇
  • android小游戏开发 2篇
  • 2019年第十届蓝桥杯C/C++省赛B组试题初步认识与探索 8篇

最新评论

  • 利用c++进行程序词法分析

    2301_76439167: 请问一下这个测试文本子么用

  • 文本串加密和解密程序。一个文本串可用事先给定的字母映射表进行加密

    abcz666: 大佬,能解释一下加密解密for的条件为什么是!=吗

  • (查找排序)为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式(两种)

    m0_74232480: 还有就是他的哪个房号排序有一点点的问题好像

  • (查找排序)为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式(两种)

    m0_74232480: 可以把int类型改成char类型

大家在看

  • 洛谷 P1507 NASA的食物计划 (dp 01背包问题) 195
  • 代码之美:掌握 IPython 的 %autoindent 自动缩进命令 306
  • 云端财富:在iCloud中安全存储你的个人财务管理数据 457
  • IPython的跨语言融合:%%javascript_header命令全解析 740
  • Laravel的缓存机制:加速应用的超级助推器 456

最新文章

  • 记录一个利用winhex进行图片隐写分离的
  • 计算顺序表中值在100到500之间的元素个数
  • 网络安全复习大纲wcf
2024年1篇
2023年10篇
2022年62篇
2021年293篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王陈锋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码宝安网站设计坪山网站改版宝安百姓网标王坑梓模板网站建设平湖网络营销大运网站优化按天计费布吉建设网站观澜模板推广罗湖关键词按天收费大芬网络营销丹竹头网络推广广州阿里店铺运营沙井企业网站制作福田阿里店铺运营光明网页设计观澜网站开发深圳标王坑梓SEO按天扣费石岩如何制作网站坂田网站建设设计大浪网站关键词优化大浪企业网站建设惠州网站搜索优化爱联网站优化软件坪地百姓网标王推广布吉网站推广福永网站排名优化塘坑外贸网站制作东莞模板网站建设松岗百搜标王歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化