哈夫曼树的基本概念

哈夫曼树的定义是对一组具有确定权值的叶子节点,选出最小带权路径长度的二叉树为哈夫曼树(WPL最小),也称最优二叉树

哈夫曼算法的实现

注意:哈夫曼树在构造时选择两个最小的权值点,默认小的在左边大的在右边,但实际上并没有硬性规定,可以互换,对长度没有影响,但本文默认小的在左边大的在右边
1.对权值节点排序,在n个权值节点中选出两个最小的,这两个节点作为左右子树形成一棵新的二叉树,根节点的值是左右子树权值的加和
2.将原序列中最小的两个权值删除,将新的权值加入到序列中(原最小两个权值的和),并排序
3.不断重复1和2步骤,直至只剩下一棵树**(结束的表示是序列只剩1个节点值)**,此树为所构造的哈夫曼树
下面用图说明哈夫曼树的构造过程,给定权值1 5 2 6 10 7,要求构造出哈夫曼树
初始状态为

1.将权值进行排序得到1 2 5 6 7 10,选出权值最小的两个节点分别是1和2,将1和2作为左右子树生成一棵二叉树,根节点值为3
2.将最小的两个节点(1,2删除),将节点3加入到序列中,此时序列为3 5 6 7 10,即

3.由于序列中的所有节点(剩余5个)大于1个,继续循环上述1和2过程,此时序列为3 5 6 7 10,将权值最小的两个节点3和5作为左右子树生成新的一棵二叉树,根节点为3+5=8
4.将3和5节点删除,将节点8加入到序列中,重新排序,此时序列为6 7 8 10,如下图

5.由于并没有消耗完序列中的所有节点(剩余4个)大于1个,继续循环上述1和2过程,此时序列为6 7 8 10,将权值最小的两个节点6和7作为左右子树生成新的一棵二叉树,根节点为6+7=13
6.将6和7节点删除,将节点13加入到序列中,重新排序,此时序列为8 10 13,如下图

7.由于序列中的所有节点(剩余3个)大于1个,继续循环上述1和2过程,此时序列为8 10 13,将权值最小的两个节点8和10作为左右子树生成新的一棵二叉树,根节点为8+10=18
8.将6和7节点删除,将节点18加入到序列中,重新排序,此时序列为13 18,如下图

9.由于序列中的所有节点(剩余2个)大于1个,继续循环上述1和2过程,此时序列为13 18,将权值最小的两个节点13和18作为左右子树生成新的一棵二叉树,根节点为13+18=31
10.将13和18节点删除,将节点31加入到序列中,此时序列为31,如下图

11.此时序列只剩1个元素,循环结束,所生成的树即为哈夫曼树。

哈夫曼编码

在通信传送时,数据表现为0和1的二进制形式。为了提高传输的速度,通常会进行数据压缩。同时,要保证编码不存在二义性。哈夫曼编码符合上述要求,能达到较优的编码方式,其原理就是自底向上构建哈夫曼树
例:假设某报文由{‘l’,‘m’,‘y’,‘z’,‘j’,‘h’}六个字符组成,每个字符出现的频率分别是{0.24,0.16,0.2,0.08,0.02,0.3},为这6个字符设计哈夫曼编码

数据预处理

首先可以将字符出现的频率转换为整数,即每个概率乘100,得到相应权值

字符 权值
l 24
m 16
y 20
z 8
j 2
h 30

构造哈夫曼树

此时l字符对应权值为24,m字符对应权值为16.等,得到6个节点的权值后,按照上文讲到的方法构造哈夫曼树(不断循环方式1和方式2直至只剩下一棵树),具体细节不再赘述。
生成的哈夫曼树如下:

按照哈夫曼编码的规则,每个根节点的左子树编码为0 每个根节点的右子树编码为1
根据上述规则可以生成每个字符(即出现频率的节点 如l为24的节点为01)对应的编码

字符 编码
l 01
m 101
y 00
z 1001
j 1000
h 11

用哈夫曼编码得到的序列长度应为24 * 2+16 * 3 + 20 * 2 + 8 * 4 + 2 * 4 + 30 * 2 = 236
而利用等长编码由于字符数为6位,需要用3位二进制数表示,因此序列长度为300
可以看到哈夫曼编码的序列明显小于等长编码得到的序列,比例为236/300。

哈夫曼树及哈夫曼编码(考试常考版)相关推荐

  1. 蓝桥哈夫曼树C语言,实验四 哈夫曼树及哈夫曼编码

    实验目的## 掌握哈夫曼树的概念.哈夫曼编码及其应用. 掌握生成哈夫曼树的算法. 会用哈夫曼树对传输报文进行编码. 掌握二叉树的二叉链表存储方式及相应操作的实现. ##实验内容## 用哈夫曼编码进行通 ...

  2. python哈夫曼树_python霍夫曼树

    class Node(): data=0 left=None right=None father=None def __init__(self,data,left,right): self.data= ...

  3. 一文看懂哈夫曼树与哈夫曼编码

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...

  4. 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现

    闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...

  5. 听说你还不懂哈夫曼树和哈夫曼编码

    基本概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途. 基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. 路径长度:路径上的分 ...

  6. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  7. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  8. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  9. 【数据结构】-哈夫曼树以及哈夫曼编码

    哈夫曼树的几个定义 哈夫曼树又叫最优二叉树:特点是带权路径最短 带权路径长度:该结点到根结点的路径长度乘以该结点的权值. 树的带权路径长度(WPL):所有叶子结点到根结点的带全路径长度之和. 最优二叉 ...

最新文章

  1. 基于REST的MVC架构设计与实现
  2. python Unicode转ascii码的一种方法
  3. 6264:走出迷宫(DFS和BFS)
  4. 服务总线yali测试_满足吉利要求的车载总线测试服务
  5. 在unity2d同屏显示9千人
  6. 对软件测试的认识你了解多少
  7. Spring MVC 中使用AOP 进行事务管理--XML配置实现
  8. js作用域与作用域链
  9. 数字孪生体技术白皮书_数字孪生体的标准化之路
  10. 常用而又不为大多数人所知的三种网页特效
  11. SpringMVC 拦截器实现
  12. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(一)
  13. Application.Current的使用
  14. lol2月26日更新后一直提示服务器维护,《lol》2月26日更新了什么 2月26日更新内容一览...
  15. 容器系列之虚拟化网络
  16. 【时间序列分析】02. 线性平稳序列
  17. 第一章-数据规范-数据分析报表设计标准
  18. js 实现60秒倒计时
  19. win7找不到win10计算机图标,win7电脑桌面图标不见了怎么办
  20. 免费在线证件照制作-超级好用

热门文章

  1. EtherCAT简介
  2. pvid与access的关系_关于Trunk、Hybrid、Access、Tag、Untag、Pvid的关系
  3. SSE(Server-sent Events)实现Web消息推送(SpringBoot)
  4. 如何使用petri网建模工具
  5. MACD详细计算方法及例子
  6. DEA(数据包络分析)程序模板
  7. 关于weinre教程使用的补充(weinre-jar-1.6.1.zip下载)
  8. ROS学习总结一:talker and listener
  9. Swin Transformer:层次化视觉Transformer
  10. php九宫格图片合成,多宫格图片合成