哈夫曼树
1.历史
- 首先是为了找到最有效的高效的(空间,整体)编码,然后借助数据结构种的树型结构,发现通过构建这样一颗二叉树,可以得到最有效的编码
2.概念
-
给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小的树。又称最优二叉树,整体判定过程效率最高的数据结构
1. 二叉树 2. 带权的节点为叶子节点 3. 树的带权路径长度最小
-
相关概念:
-
路径:一个节点到另一个节点之间的分支构成这两个节点之间的路径
-
路径的长度:路径上的分支数目之和
-
树的路径长度:根节点到
每个节点
的路径长度之和 -
节点的带权路径长度:从根节点到该节点的路径长度与节点的权值的乘积
-
树的带权路径长度:根节点到
每个叶子节点
的带权路径长度的和 (wpl) -
权值:出现的概率(根据实际情况统计而来的)
-
3. 实现
-
构建 : 使权值越大的节点,路径长度越小(越靠近根节点)
-
步骤:
-
在森林中选取两颗根节点权值最小的树做为左右子树,构建新的二叉树,更新二叉树的根节点权值为左右两个节点的权值之和
-
在森林中删除这两棵树,并把新构建的树加入森林
-
重复上诉两部,直到只有一棵树
-
注意点:
-
相同的带权节点可以构成多颗哈夫曼树
-
一般,将最新构造成的树放到等概率的最后合并,将有利于缩短码长差,并且编出的码更接近等长码,但是不同的构造方式最后构造出来的哈夫曼树的wpl是一样的
-
-
4. 应用
-
哈夫曼编码
-
场景:数据通信的过程中会将每个出现的字符转换为二进制编码,用0,1码的不同顺序代表字符,并且在设计编码的时候需要满足两个原则
-
发送和解读的一致性和唯一性
-
编码长度尽可能短
-
实现
-
等长编码 :解读简单,但是不短
-
不等长编码:可以做到尽可能的短,但是不一定满足唯一性
-
前缀编码:在不等长编码的基础上,使得每个编码不是其他任何一个编码的前缀
-
字符的使用频率作为叶子节点的权值构建一颗哈夫曼树
-
从根节点开始,左分支为0,右分支为1,从根节点到叶子节点的路径为该叶子节点的编码
-
-
-
-
静态哈夫曼编码
-
以下:需要对源数据进行多次遍历:统计
-
-