一、需要了解的知识:
1、二叉树:一棵树中的每个节点最多有两个子节点(子树)。
二、哈夫曼树:
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树。
如下图所示:
以上三个图中,
1、叶子节点的权值:每颗树的叶子节点中的数字是该叶子节点的权值(即:2,4,5,7)。
2、每个叶子节点的带权路径长度是:从根节点到该叶子节点的长度(多少根线)乘以该叶子节点里的权值。
3、树的带权路径长度:所有叶子节点的带权路径长度之和。
结论:以上三张图中,中间那张图的带权路径长度值最小(是35)。所以,中间那张图中的树是哈夫曼树。
三、哈夫曼编码:
1、场景:
哈夫曼编码是应用于数据传输时,对每个字符进行的编码(就像战争片中的密码本就是对每个字的编码)。由0和1组成,当然,计算机在传输数据是肯定用的是二进制(也就是0和1了)。
PS:在最初,还是用过等长编码。但是,等长编码的结果长度太长。
2、哈夫曼编码的思路是:
1)、根据要传输的内容中的所有字符的出现次数(作为权值)产生哈夫曼树。
2)、把哈夫曼树的左子树的边标为0。右子树的边标为1。然后,从根到叶子节点,把每个边的标识拼接起来,就是该字符的编码。
3、示例:
下表为某文件中字符的出现频率,采用霍夫曼编码对下列字符编码
1)、构造哈夫曼树:
1.1)、对以上字符的出现的频率排序: 5、9、12、13、16、45。
取出最小的两个数 5和9。作为叶子节点,产生树。同时把5和9之和14,作为树根的权值(注意:把小数写在大数的左边)
1.2)、对剩下字符的出现的频率和14进行排序排序: 12、13、14、16、45。
取出最小的两个数12和13,作为叶子节点产生树。同时把12和13之和25,作为树根的权值。形成了以下的两棵树。
1.3)、对剩下字符的出现的频率和25进行排序排序: 14、16、25,45。
取出最小的两个数14和16,作为叶子节点产生树(由于14是第一次产生的树根的权值,所以,需要把它的两个子节点带上)。同时把14和16之和30,作为树根的权值。形成了以下的两棵树。
1.4)、对剩下字符的出现的频率和30进行排序排序: 25,30、45。
取出最小的两个数25和30,作为叶子节点产生树。同时把25和30之和50,作为树根的权值。形成了以下的树。
1.5)、对剩下字符的出现的频率和55进行排序排序: 45、55。
形成了以下的树。
2)、给树上的边加上0和1(左0 右1)。并把每个叶子节点对应的字母写上
3)、每个字符的哈夫曼编码:
a:0
b:101
c:100
d:111
e:1101
f:1100。
4)、举例的编码:
bee的编码: 101 1101 1101
abc的编码:0 101 100
bccfde的编码:101 100 100 1100 111 1101