铜仁市论坛

首页 » 分类 » 问答 » 数据结构哈夫曼树
TUhjnbcbe - 2021/3/10 20:07:00

什么是树?

树是一种数据结构,它是由n(n=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。

二叉树

二叉树(Binarytree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

完全二叉树

一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

满二叉树

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k)-1,则它就是满二叉树。

最优二叉树(哈夫曼树)

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(HuffmanTree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

今天要说的是这个哈夫曼树。

一个经典例子就是,将学生的成绩分类成绩:≥90分:A,80~89分:B,70-79分:C,60-69分:D,<60分:E。

正常的写法就是:

一个一个判断,60到90,大概的流程是这样↓

这样没问题,数据量少的话,但是如果像我们学校一届一万学生的,或者甚至有些更多的,那就可能会有性能上的问题。

如果学生的总成绩数据有条,则5%的数据需1次比较,15%的数据需2次比较,40%的数据需3次比较,40%的数据需4次比较,因此个数据比较的次数为:

(5%+2×15%+3×40%+4×40%)=次

那换一种树的结构会不会好点能,就是性能上得到优化的,次判断,甚至更少?

酱紫试试。

×(2×(5%+15%+40%)+2×(30%+10%))=次

诶,确实变少了,那有没有可能找到一棵最少次数的树呢?

哈夫曼:???

概念和术语:

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。

直接上构造方法和思路:

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

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

在F中删除这两棵树,同时将新的二叉树加入F中.

重复2、3,直到F只含有一棵树为止.(得到哈夫曼树)

以上述的学生分数为例(来认真的了):

1、带权重的的每个根节点。

2、找到最小的两个节点,合起来,形成新的节点,

3、在新的节点堆里(第一行),拿到最小两个,重新又组成新的节点。

4、同上。

5、最后基本就是这么个情况了。

这!就是哈夫曼树!

这!就是最优二叉树!

计算一线现在的WLP是多少:

×(40%×1+30%×2+15%×3+(5%+10%)×4)=次

wodetian!如此一换来换去的,就把原来的次的判断优化成了次,优化了大于三分之一,如此一来这东西的作用就出来了。不得不为这老哥直呼内行。

拓展(哈弗曼编码):

该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

大二时的离散数学考过一个哈夫曼编码的例子,这个就不写了。

就是相当于这种↑,各个马为,A:0,D:10,B:,C:

思路就是哈夫曼树的差不多思路。

如果要输入ABBCBDDA要怎么构造树呢?

ABCD的权重分别是,A:0.25,B:0.,C:0.,D:0.25

按照上面的构造法,结果就是:

编码:A:,B:0,C:,D:10

电文(ABBCBDDA):1001010

译码也很简单,就是根据编码的01数字逐个从树的顶往下走,直到叶子结点就是一个马,以此类推。

------------------------------------完--------------------------------------

何里玉之巴黎铁塔反转再反转

XUANXUAN丶

1
查看完整版本: 数据结构哈夫曼树