持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
哈夫曼树(Huffman)的概念
若设二叉树有m个叶结点,每个叶结点分别赋予一个权值,则二叉树的带权路径长度为所有叶节点的权值与路径长度乘积之和。二叉树的WPL最小,它就是哈夫曼树。由此可见,带权路径长度最小的二叉树并非满二叉树,也非完全二叉树。
给定一组权值,构造出的具有最小带权路径长度的二叉树称为哈夫曼树,又称为最优二叉树。权值越大的叶结点离根结点越近,权值越小的叶结点离根结点越远,这样的二叉树的WPL最小,哈夫曼树就满足这一特性。另外,给定一组权值,构造出的哈夫曼树的形态可能不唯一,但它们的WPL都一样。从形态上可以看到,哈夫曼树中不存在度为1的结点。
构造具有最小WPL的带权二叉树的算法是哈夫曼给出的,因此又称为哈夫曼算法。其基本思想如下:
①将给定的权值按照从小到大排列成(w1, w2,…, wm),并且构造出树林F=(T1,T2,…,Tm)。此时,其中的每棵树Ti(1≤i≤m)都为左、右子树均为空的二叉树,二叉树的根结点的权值为wi。
②把F中树根结点的权值最小的两棵二叉树T1和T2合并为一棵新的二叉树T(T的左子树为T1,右子树为T2),并令T的根结点的权值为T1和T2根结点的权值之和,然后将T按其根结点的权值大小依次加入到树林F中。同时,从F中删去T1和T2这两棵二叉树。
③重复步骤②,直到构造成一棵哈夫曼树。
哈夫曼编码
在对不等长编码(哈夫曼编码属于不等长编码)的字符进行识别时,必须保证任意一个字符的编码不可能是另一字符编码的前缀,哈夫曼编码正好具有这一特点,因为在哈夫曼树中,代表每个字符的结点都是叶结点,它不可能在从根结点到另一字符的路径上,当然它的编码也不可能是另外一个字符编码的前缀。两个字符之间本来不需要分隔符,但为了译码的方便,在两个字符之间仍需要留有空白。读者不难想到,由于哈夫曼编码是不等长编码,对它进行译码的工作比较困难,这是它的一个缺点。