Skip to content

Latest commit

 

History

History
31 lines (21 loc) · 1.39 KB

6.HuffmanTree.md

File metadata and controls

31 lines (21 loc) · 1.39 KB

哈夫曼树与哈夫曼编码(Huffman Tree)

哈夫曼树是一种加权最优路径树。也就是说,每个叶子都有一个权重,叶子节点的权重乘以其到根节点的路径长度,然后对所有叶子求和,这个和是最小的。

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_1min_2对应的v的节点进行合并合并后的节点频率为new_prob
    对每个叶子节点向根节点的路径记录下来左右子树代表0和1得到各自编码即HuffmanCode
    return HuffmanTreeHuffmanCode