哈夫曼树与哈夫曼编码
哈夫曼树
构建哈夫曼树的步骤:
- 将每一个数据从小到大进行排序,每个数据都是一个节点,每个【节点】可以看成是一颗【最简单的二叉树】
- 取出根节点权值最小的两颗二叉树,组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和
- 再将这颗新的二叉树,以根节点的权值大小再次排序, 不断重复 1-2-3 的步骤,直到数列中,所有的数据都被处理,就得到一颗赫夫曼树
举例:求hello_world
进行哈夫曼编码后的长度
各个字符出现的次数:
h: 1
e: 1
l: 3
o: 2
_: 1
w: 1
r: 1
d: 1
开始构建哈夫曼树
-
排序,得到8个叶子节点,即最简单的8棵二叉树
-
取出值最小的2棵树,这里有6个节点权值均为1,任选2个,对其权值求和为2,所以得到一个新的节点”2“
-
将新生成的节点2与剩下的节点重新排序
排序后:
继续构造:
继续排序……如此重复下去,然后把每次生成的节点在同一幅图中绘制,就得到一棵哈夫曼树,最终构建的哈夫曼树是这样的:
从图中可以看出,红色的都是生成的节点,其WPL值为 1*4+1*4+1*4+1*4+1*3+1*3+3*2+2*2=32
也可以直接将红色节点的值加起来 2+2+2+4+4+7+11=32
二叉树的带权路径长度(WPL):从根节点到各个叶子节点的路径长度(即路径边数,如从11到h叶子节点长度为4)与相应节点权值(h的权值为1)的乘积的和:
哈夫曼树就是构建出使得WPL最小的一棵二叉树
哈夫曼编码
构建出 hello_world
这一字符串对应的哈夫曼树后,按如下位置添加 0
和 1
可以看出,每个叶子节点都可以用边上的 0 和 1 来唯一表示
所以hello_world
各个字符的哈夫曼编码为:
h: 0000 r: 0001 _: 0010 e: 0011
w: 100 d: 101 o: 11
l: 01
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/16013719.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)