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

哈夫曼树

哈夫曼树是一种最优二叉树,其定义是:给定n个权值作为n个叶子节点,构造一棵二叉树,若树的带权路径长度达到最小,这样的树就达到最优二叉树,也就是哈夫曼树,示例图如下:

基本概念

深入学习哈夫曼树前,先了解一下基本概念,并以上面的哈夫曼树图为例

  • 路径:树中一个结点到另一个结点之间的分支序列构成两个结点间的路径。
  • 路径长度:路径中分支的数目,从根结点到第L层结点的路径长度为L-1。例如100和80的路径长度为1,50和30的路径长度为2。
  • 结点的权:树中结点的数值,例如100,50那些。
  • 结点带权路径长度:根结点到该结点之间的路径长度与该结点的权的乘积。 如结点20的路径长度为3,该结点的带权路径长度为:3*20 = 60。
  • 树的带权路径长度:所有叶子结点的带权路径长度之和,记为WPL。例如上图树的WPL = 1100 + 280 +320 +310 = 350。

带权路径长度比较

前面说到,哈夫曼树是最优二叉树,因为符合哈夫曼树特点的树的带权路径长度一定是最小的,我们将哈夫曼树和普通的二叉树做个比较,仍以上图为例,上图的哈夫曼树是结点10,20,50,100组成的二叉树,WPL是350,用这四个结点组成普通的二叉树,结果如下:

不难计算,该二叉树的WPL = 210 + 220 + 250 + 2100 = 360,明显比哈夫曼树大,当然二叉树的组成结果不唯一,但WPL一定比哈夫曼树大。所以说哈夫曼树是最优二叉树。

哈夫曼树的构造

现在假定有n个权值,设为w1、w2、…、wn,将这n个权值看成是有n棵树的森林,根据最小带权路径长度的原则,我们可以按照下面步骤来将森林构造成哈夫曼树:

  1. 在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
  2. 从森林中删除选取的两棵树,并将新树加入森林;
  3. 重复1、2步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

以森林 (16,20,23,24,50) 为例,其构造步骤如下:

① 合并权值为16和20的树,构成权值为36的新树,森林变为(36,23,24,50);

② 合并最小的两棵树23和24,组成新的树47,这时森林变为(36,47,50);

③ 合并36和47的树作为权值83的新树,并和50结合组成根节点权值为133的哈夫曼树。

最终结果图如下:

哈夫曼编码

哈夫曼是一种无前缀编码,使用一种特别的方法为信号源中的每个符号设定二进制码,解码时不会混淆。其主要应用在数据压缩,加密解密等场合。可以与哈夫曼树进行结合生成。

给哈夫曼树的根节点分配比特0,左子树分配0,右字数分配1,一直递归下去,然后就可以得到符号的码值了。假设我有A,B,C,D,E五个字符,出现的频率(即权值)分别为5,4,3,2,1。

这样结点对应的编码为:16 - > 100,20 - > 101,23 - > 110,24 - > 111,50 - > 0

原文地址:https://www.cnblogs.com/yeya/p/9835895.html

时间: 2024-09-28 08:24:53

数据结构:哈夫曼树和哈夫曼编码的相关文章

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

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

数据结构学习笔记04树(堆 哈夫曼树 并查集)

一.堆(heap) 优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序. 数组 : 插入 — 元素总是插入尾部 ~ O ( 1 ) 删除 — 查找最大(或最小)关键字 ~ O ( n ) 从数组中删去需要移动元素 ~ O( n ) 链表: 插入 — 元素总是插入链表的头部 ~ O ( 1 ) 删除 — 查找最大(或最小)关键字 ~ O ( n ) 删去结点 ~ O( 1 ) 有序数组: 插入 — 找到合适的位置

Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)

flyfish 2015-8-1 Huffman tree因为翻译不同所以有其他的名字 赫夫曼树.霍夫曼树.哈夫曼树 定义引用自严蔚敏<数据结构> 路径 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径. 路径长度 路径上的分支数目称作路径长度. 树的路径长度 树的路径长度就是从根节点到每一结点的路径长度之和. 结点的带权路径长度 结点的带权路径长度就是从该结点到根节点之间的路径长度与结点上权的乘积. 树的带权路径长度 树的带权路径长度就是树中所有叶子结点的带权路径长度之和,通常记做

哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 术语: i)路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径. 路径中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. ii)结点的权及带权路径长度 若对树中的每个结点赋给一个有着某种含义的数值,则这个数值称为该结点的权. 结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积. iii)树的带权路径长度 树的带权路径长度:所有叶子结点的带权路径长度之和,记为WPL. 先了解一下

【算法总结】哈夫曼树和哈夫曼编码

一.哈夫曼树 1. 哈夫曼树也称最优二叉树. 叶子节点的权值是对叶子节点赋予的一个有意义的数值量. 设二叉树具有 n 个带权值的叶子结点,从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度. 给定一组具有确定权值的叶子结点,可以构造处不同的二叉树,将其中带权路径长度最小的二叉树称为哈夫曼树. 2. 基本思想: 初始化:由给定的 n 个权值 $\left\{ \omega_{1},\omega_{2},\cdots ,\omega_{n}\right\}$构造 n

《数据结构复习笔记》--哈夫曼树,哈夫曼编码

先来了解一下哈夫曼树. 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值 wk,从根结点到每个叶子结点的长度为 lk,则每个叶子结点的带权路径长度之和就是: 最优二叉树或哈夫曼树: WPL最小的二叉树. [例]有五个叶子结点,它们的权值为{1,2,3,4,5},用此权值序列可以构造出形状不同的多个二叉树. 其中结果wpl最小值的是:33=(1+2)*3+(3)*2+(4+5)*2: 哈夫曼树的构造: 每次把权值最小的两棵二叉树合并, 代码: typedef struct Tr

[数据结构] AVL树和AVL旋转、哈夫曼树和哈夫曼编码

1. AVL树 AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多次树旋转来重新平衡这个树. 节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反).带有平衡因子1.0或 -1的节点被认为是平衡的.带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树.平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来. 1.2AVL旋转 AVL树的基本操作一

数据结构--树(下)--哈夫曼树与哈夫曼编码

什么是哈夫曼树? 编码这个问题,二进制的形式,等长码.出现频率高的 不登场编码,效率能提高. 将百分制的考试成绩转换成五分制的成绩. 判定树 同一件事情,我们用了不通的判定树,就得出了不同的效率 so........如何根据结点不通的查找频率构造更有效地搜索树?这就是哈夫曼舒要解决的问题. 哈夫曼树的定义: 带权路径长度(WPL):设二叉树有n个叶子节点,每个叶子节点带有权重wk,从根节点到叶子节点的长度为lk,则每个叶子节点的带权路径长度之和就是 哈夫曼树又叫最优二叉树. 哈夫曼树就是让WPL

数据结构——第二章树和森林:04哈夫曼树与哈夫曼编码

1.结点的路径长度:从根结点到该结点的路径上分支的数目. 2.树的路径长度:树中每个结点的路径长度之和. 3.树的带权路径长度:树中所有叶子结点的带权路径长度之和WPL(T) = ∑wklk(对所有叶子结点) 4.最优树:在所有含n个结点,并带相同权值的m叉树中,必存在一棵其带权路径长度取最小值的树,称为最优树. 5.哈夫曼算法构造最优树:以二叉树为例: (1)根据给定的n个权值{w1, w2, ... , wn}构造n棵二叉树的集合F = {T1, T2, ... ,Tn},其中每棵二叉树中均