学习心得 - 初赛知识 - 哈夫曼编码 / 树

· · 算法·理论

初赛常考知识点:哈夫曼编码。

省流:合并果子,看前缀。

我们首先会得到一个频率数组 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),这个显然合法。