哈夫曼编码

算法竞赛入门经典第二版 P234

关于字符编码问题 ,二叉树可以解决前缀冲突,左右节点分别为0或1 ,因此每个叶子节点都可以表示一个字符,且01字符串不会重复。

但是最优字符编码需要考虑频率,也就是权值,如果用等长编码表示(等长不会产生前缀冲突),则权值小的字符会占用额外编码。

因此理想状态应该是频率高的字符用较短编码表示,频率低的字符用较长编码表示。比如说,如果我们有一百个字符,依次编号1~100,

而编号91~100是常用字符,每次表示这些字符就需要2或3长度,但是反过来用编号0~9来表示它们,就能节省大量空间。

哈夫曼树:在一个含有N个带权叶子节点的二叉树中,其中带权路径长度最小的二叉树,成为最优二叉树。

由引例可知,权值越小的节点,其在哈夫曼树中的深度越大,在编码问题中表现为字符频率越低,其编码长度越大。

构造哈夫曼树,给定一个权值集合:

将集合视为森林,每次取两个最小值为左右子节点,和为父节点,再将集合中该两个值删除,加入权值和,重复步骤直到集合为空。

路径长度为所有叶子节点的权值与到根节点分支数目,即该节点高度(根节点高度为0)的乘积之和。原集合中的元素都在哈夫曼树的叶子节点上。

原文地址:https://www.cnblogs.com/faded828x/p/13378170.html