哈夫曼树与哈夫曼编码及等长编码
哈夫曼树的构造:就是将给定的数据中选择最小的两个权值进行合并,然后重复该操作,构造出一个二叉树。使其带权路径长度WPL最小的二叉树称为哈夫曼树或最优二叉树。
例如:给定几个数值:0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.01
可以将其扩大一百倍,以方便计算,不会影响哈夫曼树的构造
W={7, 19, 2, 6, 32, 3, 21, 10}
选择最小的2,3进行合并为5,5 和 6 为最小的再进行合并为 11 , 重复该操作可以得到该哈夫曼树。
哈夫曼编码:
在进行数据压缩的时候,为了使压缩后的数据文件尽可能短,可采用不定长编码。其基本思想是:为出现次数较多的字符编以较短的编码。为确保对数据文件进行有效的压缩和对压缩文件进行正确的解码,可以利用哈夫曼树来设计二进制编码。
编码的概念:
(1)前缀编码:如果在一个编码方案中,任何一个编码都不是其他任何编码的前缀(最左子串),则称编码是前缀编码。00,001这个就不是前缀编码。其实就是通过这些编码准确得出数据信息,不会混淆。
(2)哈夫曼编码:对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各个支的赋值分别构成一个二进制,该二进制就称为哈夫曼编码
哈夫曼编码性质:
(1)哈夫曼编码是前缀编码
(2)哈夫曼编码是最优前缀编码
字母编号 | 出现频率 | 哈夫曼编码 | 等长编码 |
1 | 0.07 | 1100 | 000 |
2 | 0.19 | 00 | 001 |
3 | 0.02 | 11110 | 010 |
4 | 0.06 | 1110 | 011 |
5 | 0.32 | 10 | 100 |
6 | 0.03 | 11111 | 101 |
7 | 0.21 | 01 | 110 |
8 | 0.10 | 1101 | 111 |
由上面的例子得出该表
如何得出这个哈夫曼编码?以0.07扩大一百倍之后是7为例子讲解:
从叶子结点到根节点:7 ——> 17是左分支,所以赋予0
17 ——> 28是左分支,所以赋予0
28 ——> 60是右分支,所以赋予1
60 ——> 100是右分支,所以赋予1
哈夫曼编码是从根节点到叶子结点:所以0.07的哈夫曼编码是1100.
等长编码就相当于一个从根节点到叶子节点的路径为K的满二叉树,上面列表就是通过一个从根节点到叶子节点的路径为3的满二叉树得来的等长编码,方法和得到哈夫曼编码一样。
以0.07扩大一百倍后为7来讲解以下;
从叶子结点到根节点: 7——> 26 是左分支,所以赋予0
26 ——>34 是左分支,所以赋予0
34 ——>100是左分支,所以赋予0
等长编码是从根节点到叶子结点,所以等长编码是000
在对多个有序表进行两两合并时,若表长不同,则最坏的情况下总的比较次数依赖于表的合并次序(归并排序),可以借助哈夫曼树的构造思想,依次选择最短的两个表进行合并,这样可以获得最坏的情况下最佳的合并效率
哈夫曼树与哈夫曼编码及等长编码相关推荐
- 蓝桥哈夫曼树C语言,实验四 哈夫曼树及哈夫曼编码
实验目的## 掌握哈夫曼树的概念.哈夫曼编码及其应用. 掌握生成哈夫曼树的算法. 会用哈夫曼树对传输报文进行编码. 掌握二叉树的二叉链表存储方式及相应操作的实现. ##实验内容## 用哈夫曼编码进行通 ...
- python哈夫曼树_python霍夫曼树
class Node(): data=0 left=None right=None father=None def __init__(self,data,left,right): self.data= ...
- 一文看懂哈夫曼树与哈夫曼编码
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...
- 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现
闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...
- 听说你还不懂哈夫曼树和哈夫曼编码
基本概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途. 基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. 路径长度:路径上的分 ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码
第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...
- 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算
1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...
- 【数据结构】-哈夫曼树以及哈夫曼编码
哈夫曼树的几个定义 哈夫曼树又叫最优二叉树:特点是带权路径最短 带权路径长度:该结点到根结点的路径长度乘以该结点的权值. 树的带权路径长度(WPL):所有叶子结点到根结点的带全路径长度之和. 最优二叉 ...
- C++ 实现哈夫曼树和哈夫曼编码
C++ 实现哈夫曼树和哈夫曼编码 一.哈夫曼树的定义 二.哈夫曼树的构造算法 三.哈夫曼编码 四.哈夫曼算法实现 1.定义一个结点类 2.定义一个哈夫曼编码类 3.定义一个哈夫曼树类 4.设置初始值 ...
最新文章
- Python list排序
- weblogic 启动项目失败,JMS 队列通过http 方式访问
- svn 常用操作命令
- 很多字段的数据要插入另一张表_一文看懂数据库设计之逻辑设计,值得收藏
- Xcode9学习笔记67 - 打印查看程序沙箱结构中常用的几个目录
- Linux系统查看系统硬件,linux怎么查看系统硬件信息
- Docker存储空间不够,如何Docker修改存储位置以进行扩容
- 2019年开源安全现状调查报告发布
- 美团面经-java开发
- 2019-7-4日记
- python中递归函数的基例_详谈Python基础之内置函数和递归 Python递归和循环的区别...
- erp服务器维护数据备份,erp服务器备份
- 这是一个定时器,定时执行一次,用在定时发送邮件
- openjdk 配置linux环境变量,linux中使用openjdk配置java环境变量
- python中连接函数_python-使用参数连接到函数
- excel表格打印每页都有表头_Excel小技巧3:打印每页添加表头
- Flutter2 的 Sound null safety ?!以及发布pub上面的null safety标签实现
- 前端开发者应该知道的 Centos/Docker/Nginx/Node/Jenkins 操作
- android中注册的账号密码储存在,android SharedPreferences实现用户的注册和保存账号密码...
- 华为1+X认证网络系统管理与运维中级实验