重温经典之赫夫曼(Huffman)编码

先看看赫夫曼树
假设有n个权值{w1,w2,…,wn},构造一个有n个叶子结点的二叉树,每个叶子结点权值为wi,则其中带权路径长度WPL最小的二叉树称作赫夫曼树或最优二叉树。

赫夫曼树的构造,赫夫曼最早给出了带有一般规律的算法,俗称赫夫曼算法。如下:
(1)根据给定的n个权值{w1,w2,…,wn}构造n棵二叉树的集合F={T1,T2,…,Tn},其中Ti中只有一个权值为wi的根结点,左右子树为空。
(2)在F中选取两棵根结点的权值为最小的数作为左、右子树以构造一棵新的二叉树,且置新的二叉树的根结点的权值为左、右子树上根结点的权值之和。
(3)在F中删除这两棵树,同时将新得到的二叉树加入到F中。
(4)重复(2)和(3)直到F中只含一棵树为止,这棵树就是赫夫曼树。

例如下图便是赫夫曼树的构造过程。其中,根节点上标注的是所赋的权值。

重温经典之赫夫曼(Huffman)编码

重温经典之赫夫曼(Huffman)编码

重温经典之赫夫曼(Huffman)编码

设计一棵赫夫曼树,由此得到的二进制前缀编码就是赫夫曼编码。那么什么是前缀编码呢?所谓前缀编码,就是若要设计长短不等的编码,则必须是任意一个字符的编码都不是另一个字符编码的前缀。所以我们可以利用二叉树来设计二进制的前缀编码。

假设需要传送的字符为:A B A C C D A。如下图就是一个前缀编码的示例。

重温经典之赫夫曼(Huffman)编码

说了这么多理论,总该实践一下了,下面是赫夫曼编码的具体实现代码:

你可能感兴趣的:(Huffman)