哈夫曼树学习笔记

既然我们要学习赫夫曼树,那么我们首先就要知道什么叫赫夫曼树。

那么什么叫赫夫曼树呢?

一、什么叫赫夫曼树?

书上说:“赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,但是我们仅学习最优二叉树。”

看到这个还是不明白什么意思,因此在学习之前我们要结合这个图了解几个基本概念。

路    径由一结点到另一结点间的分支所构成。如:a->b a->b->e

路径长度路径上的分支数目,如:a→e的路径长度=2  a->c的路径长度=1

树的路径长度从树根到每一结点的路径长度之和。如:树的路径长度=10=2+2+2+2+1+1

带权路径长度树中所有叶子结点的带权路径长度之和。

树的带权路径长度树中所有叶子结点的带权路径长度之和。

赫 夫 曼 带权路径长度最小的二叉树。

了解这些基本概念后,可能还不是很理解什么是赫夫曼树,那么我们再看这样一个例子。

已经a的权值为7,b的权值为5,c的权值为2,d的权值为4,判断下列哪一个是赫夫曼树?

如图所示,

                           

       WPL=36                    WPL=46               WPL=35

赫 夫 曼 带权路径长度最小的二叉树。

树的带权路径长度如何计算?

(a)计算方法:WPL=7*2+5*2+2*2+4*2=36

(b)计算方法:WPL=4*2+7*3+5*3+2*1=46

(c)计算方法:WPL=7*1+5*2+2*3+4*3=35

赫夫曼树则是:WPL 最小的二叉树。

第三个带权路径长度最短,因此第三个就是赫夫曼树,即最优的二叉树。



二、如何构造一个赫夫曼树?

知道什么是赫夫曼树后,那么如何才能够构造一个赫夫曼树呢?

书上给出了如下方法:

(1)由给定的n 个权值{w1, w2, …, wn}构成n棵二叉树的集合(即森林)F = { T1, T2, …, Tn },其中每棵二叉树Ti 只有一个带权为wi 的根结点,其左右子树均空。

(2)在F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。

(3)在F 中删去这两棵树,同时将新得到的二叉树加入F

(4)重复(2)和(3), 直到F 只含一棵树为止。这棵树便是赫夫曼树。

看到这个方法后,可能还是看不懂,所以我们再看一个例子。

例1: 已知权值 W={ 5, 6, 2, 9, 7 },求构造赫夫曼树,并求其赫夫曼编码。

1.首先根据权值构成集合F={ }

2.在该集合中选取根两个最小的作为左右子树构造一棵新的二叉树,且置新的二叉树的根节点的权值为其左右子树上根节点的权值之和。

3.在该结果中删去这两棵树,同时将新得到的二叉树加入F

即该集合现在F={}

然后现在集合中最小的两个为,因此这时候便会出现两种形态的赫夫曼树。

或者

重复(2)和(3), 直到F 只含一棵树为止。这棵树便是赫夫曼树。

4.因此根据左0右1的规则,最终结果也将有两种,这两种都是赫夫曼树,都是最优二叉树。

其一:

WPL=6*2+7*2+2*3+5*3+9*2=65

6的编码为:00

7的编码:01

2的编码:100

5的编码:101

9的编码:11

或者

其二:

WPL=2*3+5*3+6*2+9*2+7*2=65

6的编码为:01

7的编码:000

2的编码:000

5的编码:001

9的编码:10

********************例子一结束**********************************

做完这个例子后,应该差不多明白如何构造一个赫夫曼树了,那么我们再看一个下面例子练练手:

操作要点1:对权值的合并、删除与替换

——在权值集合{7,5,2,4}中,总是合并当前值最小的两个权值

注:方框表示外结点(叶子,字符对应的权值),圆框表示内结点(合并后的权值)。

操作要点2:按左0右1对Huffman树的所有分支编号!

Huffman编码结果:

d=0,  i=10,  a=110,  n=111

WPL=1bit×7+2bit×5+3bit(2+4)=35

时间: 2024-10-07 05:45:16

哈夫曼树学习笔记的相关文章

哈夫曼树学习

基本概念: 1.路径是指从一个节点到另一个节点之间的分支序列,路径长度是指从一个节点到另一个节点所经过的分支数目. 2.实际生活中,我们为每一个节点赋予实际的意义的实数,称该实数为节点的权.在树形结构中把树根到某一节点的路径长度与该节点的权乘积叫该节点的带权路径长度. 3.树的带权路径长度是树中所有叶子节点的带权路径长度之和.                                  举例说明一下:c的权重分别为7,5,2,4.路径长度为层数-1即到根节点的长度 哈夫曼树: 哈夫曼树又叫

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

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

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

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

《大话数据结构》笔记(6-3)--树:赫夫曼树

代码实现: 第六章    树:赫夫曼树 赫夫曼树定义与原理 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度. 树的路径长度就是从树根到每一结点的路径长度之和. 对于带权的结点,结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积. 树的带权路径长度为树中所有叶子结点的带权路径长度之和. 假设有n个权值{w1, w2, ..., wn},构造一棵有n个叶子结点的二叉树,每个叶子结点带权wk ,每个叶子的路径长度为lk,则其中带权路径长度WPL最

树/二叉树(哈夫曼树/红黑树)笔记

1.树是一种常用数据结构,它是非线性结构. 2.树中任一普通节点可以有0或者多个子节点,但只能有一个父节点. 根节点没有父节点, 叶子节点没有子节点. 3.二叉树: 1)每个节点最多只能有两个子树的有序树 2)左边的子树称为左子树 3)右边的子树成为右子树 4)一棵深度为k的二叉树,如果它包含了(2^k-1)个节点,就把这棵二叉树称为满二叉树 4.满二叉树的特点: 1)每一层上的节点数都是最大节点数,即各层为1,2,4,8,16 .... (2^k-1) 2)一棵有n个节点的二叉树,按满二叉树的

php 二叉树 与赫夫曼树

在学习图之前,中间休息了两天,感觉二叉树需要消化一下.所以中间去温习了下sql,推荐一本工具书<程序员的SQL金典>看名字不像一本好书,但是作为一个不错的SQL工具书还是可以小小备忘一下.涵盖内容不详细但是挺广,覆盖多种主流数据库 言归正传,以前知道折半查找,二叉树的概念也是感觉挺有意思,二叉树的实现有一个案例很不错,代码如下 class BiNode{ public $data; public $lchild; public $rchild; public function __constr

哈夫曼树---POJ3253

http://poj.org/problem?id=3253 这就是 最典型的哈夫曼树的题型,我们就根据这道题学习一下哈夫曼树 这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出13被用到2次,8被用到1次13*2+8=34. 这幅图片,我们先据下21,再据下5,再据下8得到34,即16*2+5=37. 所以,对于这道题,我们运用贪心的思想和哈夫曼树 1 #include<queue> 2 #include<stdio.h> 3 using namespace

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

详细了解哈夫曼树和背包问题

写在前面 最近在疯狂复习数据结构和算法,虽然看完了一部完整的视频.但是转眼看看自己手中的<剑指Offer>里面还是不是很清楚...而且最近也突然觉得自己知识和别人比起来就是一个渣渣.各种被人家吊打... 这两个算法一个(哈夫曼树)是看最近视频动手实践的,一个(背包问题)是前段时间一个面试里面的题目,当时不知道这是一个系类的问题,昨天和大神聊完天之后才明白.所以乘着短暂的热情还在就记录下来先从哈夫曼树开始!! 1.哈夫曼树(实现基本的编码解码) 简单定义: 给定n个权值作为n个叶子结点,构造一棵