天天看点

哈夫曼树 & 哈夫曼编码

哈夫曼树又称最优二叉树,是一种 带权路径长度 最短的二叉树。所谓的带权路径长度,就是树中所有叶节点的权值乘以其到根节点的路径长度之和。

假如树的n个叶节点权值分别为 w1,w2,w3...wn 。其到根节点的路径长度分别为 L1,L2,L3...Ln。

则带权路径长度 WPL = w1*L1 + w2*L2 + w3*L3 + ... + wn * Ln

哈夫曼编码编码步骤:

1.对给定的 n 个权值 {w1,w2,w3...wn} 构成二叉树的初始集合 F = {T1,T2,T3...Tn}

2.在 F 中选取两个权值最小的节点作为新构造的二叉树左右子树,新的二叉树的根节点的权值为其左右子节点的权值之和。

3.从 F 中删除这两个节点,并把新的节点权值(它们的和)加入到 F 中

4.重复 2 和 3步,直到 F 中只有一个节点为止。

举个例子,对 A B C D 进行哈夫曼编码, 它们的权值分别是 1,2,3,4

第一步,选取 A B 构成新的二叉树,左 0 右 1

如图:

哈夫曼树 & 哈夫曼编码

在 fasttext中,利用了类别(class)不均衡这个事实(一些类别出现次数比其他的更多),通过使用 Huffman 算法建立用于表征类别的树形结构。因此,频繁出现类别的树形结构的深度要比不频繁出现类别的树形结构的深度要小,这也使得进一步的计算效率更高。

继续阅读