Windows程序员必须掌握的计算机编码问题——哈夫曼编码

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下计算机中的编码问题,来看第四部分,哈夫曼编码。

哈夫曼树,又叫霍夫曼树、最优二叉树,表示带权路径最短的树,什么意思呢,没听懂......

唉,所以我说,这书上的表述实在是......

其实,为什么要搞出个哈夫曼编码呢,其实目的就是,通过一种编码方式,使得文件字符编码总长度最短。

先来看几个基本定义:

路径和路径长度:一棵树中,从一个节点向下可达到的叶子节点之间的通路,称为路径。路径中分支的数量称为路径长度。若规定根节点的层数为1,则从根节点到第L层节点的路径长度为L-1。

节点的权及带权路径长度:树中节点的数值,称为节点的权。带权路径长度=从根节点到该节点之间的路径长度*该节点的权

树的带权路径长度:所有叶子节点的带权路径长度之和,记为WPL。

好,再来看哈夫曼树构造算法。假设n个权值为w1、w2、......、wn,准备构造的哈夫曼树有n个叶子节点。具体构造的规则为:

第1步:将w1、w2、......、wn看成是有n棵树(树仅有一个节点)的森林。

第2步:在森林中选出两个根节点的权值最小的树合并,作为一棵新树的子树,且新树的根节点权值为其子树根节点权值之和。

第3步:从森林中删除选取的两棵树,并将新树加入森林。

第4步:重复2、3步,直到森林中只剩下一棵树为止,该树即为所求得的哈夫曼树。

最后就是开始哈夫曼编码。从根节点开始,为到每个叶子节点路径上的左分支赋值0,右分支赋值1,并从根到叶子的路径方向形成该叶子节点的编码。

举例,已知5种字符a、b、c、d、e,出现的频率为5、6、9、14、8,则构造哈夫曼树如下图:

 哈夫曼树构造完毕后,接下来进行哈夫曼编码。

 如上图,在该例子中,从根节点往下数,a的编码就是000,b的编码就是001,c的编码就是10,d的编码就是01,e的编码就是11。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值