学习心得 - 初赛知识 - 哈夫曼编码 / 树
初赛常考知识点:哈夫曼编码。
省流:合并果子,看前缀。
我们首先会得到一个频率数组 \(w=\set{2,3,5,7}\)。然后我们要对这个频率数组建立一个哈夫曼树,其实就是类似启发式合并的东西。首先合并两个最小的数,其中小的作为左子树,大的作为右子树(如 \(\text{T1}\ \color{orange}2\) 和 \(\text{T2}\ \color{orange}3\) 合并到 \(\text{T5}\ \color{blue}5\))不停合并,直到剩下一个所有数之和,就是根节点了,合并结果如下:
引用自知乎文章。

这样建立的树一定是一颗最优二叉树。
然后构造出来,以左子树边 \(0\),右子树边作为 \(1\),然后按照顺序走就可以走出一个节点的哈夫曼编码。这玩意对压缩字符串特别有帮助(记录频次即可)接下来讲点实用一点的,如何判断哈夫曼编码组合是否是合法的?因为哈夫曼编码没有前缀重复,所以可以轻松判断。
比如说 (0,1,00,11),这个东西可以构造出树没错,但它不满足最优化性质(前缀重复,可以换位置)所以不合法。
再比如说 (00,01,10,11),这个显然合法。
文章同步载入于洛谷,详见文章下方链接。
本文来自博客园,作者:Ivan422,转载请注明原文链接:https://www.cnblogs.com/Exfish/p/23277174。

浙公网安备 33010602011771号