霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln)
,N个权值Wi(i=1,2,...n)
构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)
。可以证明霍夫曼树的WPL是最小的。
霍夫曼树常处理符号编写工作。根据整组数据中符号出现的频率高低,决定如何给符号编码。如果符号出现的频率越高,则给符号的编码越短;如果符号出现的频率越低,则给的符号的编码越长。
进行霍夫曼编码
假设我们要给一个英文单字"F O R G E T"
进行霍夫曼编码,而每个英文字母出现的频率如下:
Step1:创建一个霍夫曼树
⒈ 将每个英文字母依照出现频率由小排到大,最小在左。
⒉ 每个字母都代表一个终端节点(叶节点),比较F.O.R.G.E.T
六个字母中每个字母的出现频率,将最小的两个字母频率相加合成一个新的节点。发现F
与O
的频率最小,故相加2+3=5
。
⒊ 比较5.R.G.E.T
,发现R
与G
的频率最小,故相加4+4=8
。
⒋ 比较5.8.E.T
,发现5
与E
的频率最小,故相加5+5=10
。
⒌ 比较8.10.T
,发现8
与T
的频率最小,故相加8+7=15
。
⒍ 最后剩10.15
,没有可以比较的对象,相加10+15=25
。
最后产生的树状图就是霍夫曼树,下图演示了构造霍夫曼树的过程:
Step2:编码
1. 给霍夫曼树的所有左链接'0'
与右链接'1'
。
2. 从树根至树叶依序记录所有字母的编码,如下图:
Ref
https://zh.wikipedia.org/wiki/%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81