哈夫曼树是一种加权最优路径树。也就是说,每个叶子都有一个权重,叶子节点的权重乘以其到根节点的路径长度,然后对所有叶子求和,这个和是最小的。
Huffman编码利用Huffman树对不同的字符进行编码,以求获得最高的码率(最小的编码长度),其中心思想是先统计字符的频率,让出现频率高的码长短,出现频率低的码长长。可以证明,Huffman编码是最优的,即码长等于香农熵,也就是说,Huffman是一种无损压缩。
在NLP中词向量学习的Hierachical softmax中,也用到了Huffman编码对所有word建立Huffman树。从而提高训练的效率。
建立Huffman树的算法流程:
输入:待编码字符 v1, v2, ..., vn,以及对应的频率 p1, p2, ..., pn
输出:Huffman树及编码
def genHuffmanTree(p):
建立HuffmanTree,只有叶子节点v1,...,vn
while len(p) > 1:
p = ascendingsort(p)
min_1, min_2 = p[0], p[1]
p.remove(min_1)
p.remove(min_2)
new_prob = min_1 + min_2
p = p + [new_prob]
对min_1,min_2对应的v的节点进行合并,合并后的节点频率为new_prob
对每个叶子节点,向根节点的路径记录下来,左右子树代表0和1,得到各自编码,即HuffmanCode
return HuffmanTree,HuffmanCode