数据结构 - 哈夫曼树和哈夫曼编码

哈夫曼编码是一种变长前缀编码,用于数据压缩。通过构建哈夫曼树,频繁出现的字符被赋予较短的编码,减少传输的总长度。本文介绍了哈夫曼树的构造过程、编码与解码方法,以及算法实现,帮助理解这一重要的数据结构和压缩技术。
摘要由CSDN通过智能技术生成

哈夫曼树和哈夫曼编码

哈夫曼(Huffman)编码是个实用的压缩编码方案。

哈夫曼树

引子

我们观察以下代码:

if( a < 60) {
   
	printf("不及格\n");
}else if( a < 70){
   
	printf("及格\n");
}else if( a < 80){
   
	printf("良好\n");
}else if( a < 90){
   
	printf("优秀\n");
}

我们用树来表示这个条件结构:
在这里插入图片描述
由于试卷结构,绝大多数的学生成绩集中在70-89之间,因此需要我们对判断流程树进行修改,达到最高的效率。
在这里插入图片描述

定义与原理

我们把刚刚的分数表按照范围进行标识:

A: 0~59 5% 不及格
B: 60~69 15% 及格
C:70~89 70% 良好
D:90~100 10% 优秀

把这棵二叉树简化为叶子结点带权的二叉树(树结点间的连线相关的数叫做权,Weight)。

如下:
在这里插入图片描述
🖊定义

  • 结点的路径长度:从根节点到该结点上的路径上的连接数

如左树中C的路径长度为3

  • 树的路径长度:树中每个叶子结点的路径长度之和

如左树的路径长度为1+2+3+3=9

  • 结点带权路径长度:结点的路径长度权值的乘积

如左树中C的带权路径长度为3*70=210

  • 树的带权路径长度:
    即WPL(Weighted Path Length)是树中所有叶子结点的带权路径长度之和

如左树的带权路径长度为1*5 + 2*15 + 3*70 +3*10 = 275;而右树的WPL为1*10 + 2* 70 + 3*5 + 3* 15 = 210

WPL的值越小,说明构造出来的二叉树性能越优。显然右树更出彩。
我们把构造出的最优二叉树称为哈夫曼树

🎯构造规则

例如:频率表 A:60, B:45, C:13 D:69 E:14 F:5 G:3

⭐️第一步:找出字符中最小的两个小的在左边,大的在右边,组成二叉树。在频率表中删除此次找到的两个数,并加入此次最小两个数的频率和。

F和G最小,因此如图,从字符串频率计数中删除F与G,并返回G与F的和 8给频率表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值