一棵更优化的二叉树

Posted 翀与他的世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一棵更优化的二叉树相关的知识,希望对你有一定的参考价值。


本文根据现实合理想象,如有与当时现实相符,请以现实为准。




快递员与志愿者




这是2029年一个春光明媚,木棉盛开的日子。一群青年正在长者中心做志愿者,他们志愿者中的其中一个任务,就是开着电单车在街道的特定区域为行动不便的老人派送午餐。

一棵更优化的二叉树

行程最短还与目的地的分布有关

如何使总行程最短?(总行程=路程*装载的物品质量)


有6名志愿者负责6个社区的配餐任务,他们分别有5、7、9、11、13、15份长者午餐,需要派送往6个不同的社区。因长者午餐与社区的对应数量是一定的,以下讨论社区如何分布时总行程最短。

一棵更优化的二叉树

若涉及路径具体位置的问题,就属于图结构的问题,不在我们的考虑范围中



问题分析




这种最优化的二叉树是赫夫曼树,也就是一种所有双亲节点都有两个孩子的二叉树。这样能实现尽可能短的总行程。


首先,我们把这些数字都罗列出来,按照大小升序排列。

一棵更优化的二叉树

然后,我们找出这些数字里面最小的两个,把他们连起来,把他们的和作为他们的双亲。

一棵更优化的二叉树

接着,重复上述操作,把每一次没有双亲的节点放在一起,比较出最小的两个,再连起来,直到只剩下一个没有双亲的节点为止。

一棵更优化的二叉树

一棵更优化的二叉树

一棵更优化的二叉树

最终经过整理之后,就是一棵赫夫曼树。

一棵更优化的二叉树

我们可以看到,这时候的总行程为(5+7+9+11)*3+(13+15)*2=152,也就是说,当需求大的社区离长者中心更近的时候,总行程更短。




更短的行程为了什么




两天之后,志愿者们正在给长者中心准备即将到来的周末活动的礼品,需要购买199个6种颜色的礼物,礼物按无规律顺序分发。

一棵更优化的二叉树

就像如何更简洁地存储只有几件商品的小船一样

有人认为,如果是单纯的“红黄黄绿紫蓝绿红绿黄红橙……”的顺序分发礼物,是很乱的,为什么不能以0和1来标记礼物的颜色呢?


这也需要用到赫夫曼树,6种颜色编号需要3位二进制,而且是每个颜色编号都要用3位。而赫夫曼树可以显著缩短编码。

一棵更优化的二叉树

在糕点店的售货系统中,“千层糕”要用48位存储,使用前缀码可减少存储

而缩短编码也属于上面更短的行程的一种解决方式,如当绿色礼物的数量分别为39,58,25,18,43,16个的时候,如果用一般的编码,需要3*199=597位,如果使用赫夫曼树,只需要2*(58+39+43)+3*25+4*(16+18)=491位(缩减了约18%)。


虽然0和1的编码对人类语言来说还是不好记,但到了计算机领域,0和1的前缀码更加容易被执行。

一棵更优化的二叉树

一棵更优化的二叉树

汉字没有用满16位二进制,所以通过前缀码对常用汉字进行压缩是有用的



赫夫曼树的扩展性质




赫夫曼树的结构数量很少,而且赫夫曼树的形态很优美。


通过枚举可以知道,2个叶子节点的赫夫曼树有1种,3个为2种,4个为5种,n个为C(2*(n-1),n-1)/n!种。(即卡特兰数)

一棵更优化的二叉树

一棵更优化的二叉树

一棵更优化的二叉树

优美的赫夫曼树的结构种类等于优美的卡特兰数,不只是巧合

当我们规定左子树必须小于等于右子树的时候,我们可以得到,通常情况下,根据每个叶子节点所有叶子节点的值的和的1/2^n,可以大致判定它在哪一层。而当叶子节点大于所有叶子节点和的1/2时,则这个节点必在第1层。


而赫夫曼树最终有多少层的问题,在通常情况下是log2(n)+1(n为叶子节点个数)。当叶子节点间方差较大的时候,就需要用到更多的层数,但不会大于n层。


在前缀码的压缩效率上,当叶子节点数量近似于2^n+1的时候,或者叶子节点的值的方差很大的时候,压缩效率会更高,尤其是字符数量更多的时候,这个数值会趋向于[log2(n)]/[log2(n)+1](n为字符种数)。例如包含9种10000个字符的字符串,正常编码需要4*10000=40000位,但当9种字符分别有9992,1,1,1,1,1,1,1,1个时,只需要9992+2+3+4+5+6+7+8+9=10036位,压缩了75%。


总之,赫夫曼树把树的路径降低到最小的方法,使得对于形似树结构的问题,可以用更加压缩的方式解决。


一棵更优化的二叉树

一棵更优化的二叉树

一棵更优化的二叉树

就像逛街的时候,拿着尽可能少的东西走比较多的路更好

志愿者们通过对赫夫曼树的应用,锻炼了他们实现整体最优的能力。一棵二叉树让他们的脉络更加清晰。


点击文字回顾往篇: