2018.2.14 Java中的哈夫曼编码

概念

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

哈夫曼原理

2018.2.14 Java中的哈夫曼编码

哈夫曼算法流程图

2018.2.14 Java中的哈夫曼编码

哈夫曼树

给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

树节点间的边相关的数叫做权。

2018.2.14 Java中的哈夫曼编码

从树中的一个节点到另一个节点之间的分支构成两个点之间的路径,路径上的分支数目称作路径长度。

图中二叉树a中,跟节点到D的路径长度就是4,b中根节点到D的路径长度为2。

树的路径长度就是从树根到每一个节点的路径长度之和。二叉树a的路径长度就为1+1+2+2+3+3+4+4=20。二叉树b的树路径长度就为1+2+3+3+2+1+2+2=16。

如果考虑带权的节点,节点的带权的路径长度就是从该节点到树根之间的路径长度乘该节点的权。

数的带权路径长度就是所有叶子节点的带权路径长度之和。

带权路径长度(WPL)最小的二叉树称作哈夫曼树。

如何构造哈夫曼树

下面我们以【5、8、4、11、9、13】为例来画出哈夫曼树(数字大小代表权重大小,越大的权重越大)

第一步:按从小到大排序。

【5、8、4、11、9、13】→【4、5、8、9、11、13】

第二步:选最小两个数画出一个树,最小数为4和5。

给定的4、5、8、9、11、13为白色, 红色的9为4+5,与给定的白9无关,新序列为:【红9(含子节点4、5)、8、9、11、13】

2018.2.14 Java中的哈夫曼编码

之后一直重复第一、第二步:排序然后取两个最小值。实际就是一个递归过程

排序:

2018.2.14 Java中的哈夫曼编码

取两个最小数8和9:

2018.2.14 Java中的哈夫曼编码

排序

2018.2.14 Java中的哈夫曼编码

区两个最小数11和9

2018.2.14 Java中的哈夫曼编码

排序,然后取两个最小数13和17:

2018.2.14 Java中的哈夫曼编码

取两个最小数20和30:

2018.2.14 Java中的哈夫曼编码

上一篇:java中assert的使用


下一篇:d3 中exit() remove()正确工作的方式