哈夫曼树的实现、应用和证明

[mathjax]这里是我的个人网站: https://endlesslethe.com/huffman-tree-tutorial.html 有更多总结分享,最新更新也只会发布在我的个人网站上。 排版也可能会更好看一点=v=什么是哈夫曼树给定n个权值,作为n个叶结点,构造一棵二叉树,而这棵树的特点是,有n个叶节点,叶节点的值为给定的权值。而内部节点的值为子树的权值和。 ...
摘要由CSDN通过智能技术生成

这里是我的个人网站:
https://endlesslethe.com/huffman-tree-tutorial.html
有更多总结分享,最新更新也只会发布在我的个人网站上。
排版也可能会更好看一点=v=

什么是哈夫曼树

给定n个权值,作为n个叶结点,构造一棵二叉树,而这棵树的特点是,有n个叶节点,叶节点的值为给定的权值。而内部节点的值为子树的权值和。
这样的二叉树有很多,但树的带权路径和达到最小,则这棵树被称为哈夫曼树。
huffman tree 1

Note:带权路径和指的是所有叶节点的权值*深度和,即\(\Sigma value∗deep=100+2∗50+3∗20+3∗10\)
而我们不妨让内部节点的值为子树的权值和,我们可以发现,实际上一棵树的带权路径和=这棵树的所有节点值之和-根节点的值。(显然)

哈夫曼树有什么用

哈夫曼树主要应用在文本编码上。我们考虑如何将文本中出现的单词编码为二进制数(01串),让文本的总长度最小。
对于文本{1, 1, 2, 2, 3, 3, 3, 5},我们可以将单词1、2、3、5出现的频率作为叶节点的权值,为{2, 2, 3, 1}。那么上述最短编码问题等价于寻找一棵树,其带权路径和最小,也就是找对应的哈夫曼树。

唯一可译码

如果我们直接将单词按照频率的从高到低排序,不就得到了一个编码了吗?
但这样的编码不是一个“唯一可译码”,即对于10001010100101,我们不能正确地分割。“唯一可译码”是通信上的概念,指的是接收到的01串可以被无二义地分割,得到唯一的表示。
而哈夫曼编码是“唯一可译码”,甚至还是“即时码”,因为后面根据编码规则,我们会看到,哈夫曼树得到的编码满足即时码的条件“任何码都不是其他码的前缀”。

最短编码问题

这里为什么说最短编码问题等价于寻找一棵带权路径长度最小的树呢?

下面是对于给定一棵树的编码规则:
1. 将单词的出现次数作为叶子结点,每个字符出现次数作为该叶子结点的权值
2. 规定树中所有左分支表示字符0,所有右分支表示字符1,将依次从根结点到每个叶子结点所经过的分支的二进制位的序列作为该结点对应的字符编码
3. 由于从根结点到任何一个叶子结点都不可能经过其他叶子,这种编码一定是前缀编码,树的带权路径长度正好是文件编码的总长度

我们故如下图所示的哈夫曼树,我们不妨编码为:

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值