哈夫曼树(huffman)

哈夫曼树是一种用于优化条件判断效率的最优二叉树。它通过构造过程使得权值越大,叶子节点越接近根节点,从而降低路径长度,提高效率。哈夫曼树在编码中尤其有用,通过哈夫曼编码可以实现字符的不等长编码,减少电文传输的位数,同时保证编码的唯一性。构建哈夫曼树的过程包括将节点按权值排序,不断合并最小权值节点直至只剩一个树。在Java中,可以实现哈夫曼树的构建来优化编码和数据传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、为什么需要哈夫曼树?

      在实际开发过程中,我们常常会用到大量的条件判断,这些条件判断直接影响着程序的执行效率。比如我们在一个将分数转换成等级的程序中,很容易想到使用如下的代码来实现:

if(score < 60) {
    return "不及格";

} else if(score < 70) {
    return "及格";

}else if(score < 80) {
    return "中等";

}else if(score < 90) {
    return "良好";

} else {
    return "优秀";

}  

      分析上面的程序的时间消耗,则可能会发现程序的缺陷。程序的时间消耗与score的分布相关,在两种极端情况下,如果score全在60以下,则每个score只需要一次比较即可;如果score全在90分以上,则每个score的结果需要经过4次比较才能返回结果,时间差异较大,因此在比较过程中我们考虑将各个score范围。按照预先设定的比例进行排序,将比例较高的放到前面,占比较小的放到后面,这样可以在一定程度上减少比较次数。假设我们已知各范围分数占比如下:


这里写图片描述

      按照上面假设的比重可以发现70分以上的比重占了80%,不过按照如上的程序需要通过三次的判断才能到达,70~79分占的比重最高,占了40%,不及格所占的比例最少,我们根据比例的多少重新构建二叉树。
      为了更直观的比较,我们首先对为优化之前的程序构建一棵二叉树,如下图:


这里写图片描述

按照各分数比重优化之后的二叉树,如下图:


哈夫曼树

      对比两种结构,显然第二种结构的判定效率更高。那么第二种结构是不是效率最高的呢?我们该如何去设计一棵效率最优的二叉树呢? 我们把这种效率最高的二叉树称为“最优二叉树”,也称“哈夫曼树(huffman)”。


二、哈夫曼树的定义与原理

我们把上面这两棵树简化成叶子节点带权值的二叉树(节点间的边的相关数叫做权weight)。

百度百科关于权值的解释如下
权值就是定义的路径上面的值。可以这样理解为结点间的距离。通常指字符对应的二进制编码出现的概率。
至于哈夫曼树中的权值可以理解为:权值大表明出现概率大!
一个结点的权值实际上就是这个结点子树在整个树中所占的比例。


哈夫曼树

      如上图所示。A表示不及格、B表示及格、C表示中等、D表示良好、E表示优秀,其中每个分支线上的数字就是我们在前面提到的各个成绩所占的百分比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值