欢迎光临散文网 会员登陆 & 注册

数据结构——五分钟搞定哈夫曼树,会求WPL值,不会你打我

2023-07-23 13:24 作者:狗哥_玖稻泷  | 我要投稿

[低配 简单 好抄]借用up主,写一下笔记:

可以解决放哪边和放哪层的问题

一样的题目:

19,21,2,3,6,7,10,32

第一步:从小到大排序

2,3,6,7,10,19,21,32

在草稿纸可以斜着排序出来

然后开始挑前三个对比(2 3 6),较小的两个相加(2 3),并将结果插入未计算顺序序列

序列(5 6 7 10 19 21 32)

然后重复进行对比,取较小的两个相加(5 6)

然后接着重复(把结果放到未计算的序列中进行排序、较小的相加),不管结果是否为最大最小,只管把较小的两个相加(7 10)

序列(7 10 17 19 21 32)

重复,挑较小的两个相加(因为之前的已经排序过,所以不会出错)

序列(11 17 19 21 32)

序列(19 21 28 32)

重复排序,然后较小的两个相加

序列(28 32 40)

最后剩下的两个排序(40 60),相加,得到完整树

然后一歪头,树就出来了


计算WPL:

其实可以理解成黄金矿工,越深价值越大(严格说就是越深就越长,计算机实现代价越大,但是又要考虑到其本身的值,所以为什么要追求哈夫曼与WPL最小)

其实常见的大多数两派,一些老师是根据层数计算,一些老师是根据边个数进行计算:

1.up主的每深一层就是加1,根节点为0层。

2.左边长值为0,右边长值为1

其实两个意思都是一样的,从第0层下到第一层肯定是一条边就能实现,两层两条。所以如题值32的节点,是在第2层所以23*2,换一种思路它离根节点也就是0层就是32→60→100两条边,所以计算结果亦是32*2

总结步骤:

从小到大排序→挑最小的两个相加,剩下的是未计算序列→把结果顺序插入序列→挑最小的两个相加→......→最后剩下俩相加。树就成了

注意:如果有良好的习惯,在每次相加的时候按照相加的两个节点左右大小排序,那么最后两个相加后抓着根节点往上一提就出来了。如果忘了也可以先提起来然后一层一层的排序,排序时需要把排序节点下面的子节点打包一起排序。

这个方法可以不用考虑例如题中值7与值10相加后放哪的问题,因为在两个节点相加的时候已经进行排序了

可能当时7和10放在了左边,但是下一步11与17比较排序时还是会放回正确的位置的。

忘了放哪一层也不用考虑,因为到最后把树一提的时候7和10上面最短永远是3条边7/10→17→28→60→100,所以一定是在第五层

实际草稿纸计算过程:


如有错误请指正,谢谢。


数据结构——五分钟搞定哈夫曼树,会求WPL值,不会你打我的评论 (共 条)

分享到微博请遵守国家法律