赫夫曼树
前置知识
- 路径长度和带权路径长度
路径长度:两节点间路径的分支数量为路径长度。如二叉树a从根节点到D节点的路径长度为4,根节点到B节点的路径长度为2。
树的路径长度:从根节点到每一个结点的路径长度之和。如二叉树a的路径长度为:1+1+2+2+3+3+4+4=20。
带权路径长度:从该节点到树根节点的路径长度乘上节点的权值。
树的带权路径长度(WPL):树中每个叶子结点的带权路径长度之和。如二叉树a中的WPL=5×1+15×2+40×3+30×4+10×4=315。b中的WPL=5×3+15×3+40×2+30×2+10×2=220。(图中省略了%号)
带权路径长度最小的二叉树称为赫夫曼树。
假设节点的权值为一个文件中某个字符出现的概率,同时这个文件拥有1000个字符,则使用a树想要找到某个字符需要3150次查询,而b树只需要2200次。
- 构造赫夫曼树
1.先把有权值的叶子结点按照从小到大的顺序排列成一个有序序列AEBDC。
2.取两个最小权值的结点作为一个新节点N1的两个子结点,注意相对较小的是左孩子,这里就是A 为N的左孩子,E为N1的右孩子,N1的权值变为两个孩子节点权值之和重新加入到序列中,
同时保持有序。
3.重复第一步操作直到只剩一个节点为止,这最后一个节点便是赫夫曼树的根节点。
结果
赫夫曼编码
赫夫曼树不仅仅可以用来减少判断的次数还可以用来编码,减少编码的长度从而实现对文件压缩的效果。
例如正常情况下我们可以对字符这样编码
现在要对含有这六个字符的字符串进行压缩。
假设六个字母的频率为A 27,B 8,C 15,D 15,E 30,F 5,合起来正好是100%。那就意味着,我们完全可以重新按照赫夫曼树来规划它们。
之后依照遍历时是向左走还是向右走对字符重新编码可得
可以看到一些字符变短了,这样也就实现了压缩效果。需要注意的是,任意一个字符的编码不是另一个字符编码的前缀,例如一个字符的编码为1001,如果另一个字符的编码是100,在遍历
一个字符串10011001时,无法获知刚开头是字符1001的编码还是100的编码,从而造成错乱。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix