【数据结构】树-哈夫曼树与哈弗曼编码

在这里插入图片描述
层层if判断就像是一棵一直往下的树,这种树叫做“判定树”。
如果90分以上的人很多,那么想得到grade = 5的结论,在这之前还需要进行4次判断,有点麻烦,还不如直接把这个判断放到if()中,作为首选判断条件更好

如果考虑到成绩分布
在这里插入图片描述
能够计算出平均查找效率就是
比例 × 第几次判断 = 3.15

在这里插入图片描述
修改判定树能优化查找效率,因此可以通过修改判定树来优化查找效率。
这就是哈夫曼树的思想

在这里插入图片描述
在这里插入图片描述
ANS:34、50、33
拿第三个为例,1、2到根节点的长度为3
3到根节点长度为2;4、5到根节点长度为2
WPL = 13 + 23 + 32 + 42 + 5*2 = 33

Huffman树的构造
给定权值{1,2,3,4,5}
取两个最小的,即1和2,合并成一个二叉树
在这里插入图片描述
再从新的权值组{3,3,4,5}里再选出2个最小的合并成一个新的树
在这里插入图片描述
再从{6,4,5}里挑2个最小的
在这里插入图片描述
此时这两个是独立的树

再剩下9、6合并,成一个完整的树
在这里插入图片描述
伪代码如下:
在这里插入图片描述
这里的T,可以理解为又是树,但我们只需考虑这个树的根节点,然后放到Huffman里组成了新的树
类似于两个链表合并成一个新链表
DeleteMin在之前的堆里面有讲过了,大意是删除根节点,然后将堆中(数组)最后一个元素拿到根节点,size–,再把这个节点往下进行判断-交换,产生一个新的最大/小堆

Huffman编码
对于一些字符,在内部会有一些编码方式,比方说,设a:1,e:0,s:10,t:11,那么有一串字符串为1011,那么它是怎么样的字符组合呢?
显然答案不唯一,产生了二义性
避免二义性的方法:
使用前缀码(prefix code):任何字符的编码都不是另一字符编码的前缀
二叉树可用于编码
规定:左为0,右为1;字符只能在叶节点
在这里插入图片描述
这样能保证字符唯一,内存消耗就是频率×代表的二进制代码
要达到消耗最小,这就是频率×权重的问题,自然能想到哈夫曼树
在这里插入图片描述