哈夫曼树也就是哈夫曼编码,它是由哈夫曼这个人想到的一种编码方式。
通常存储信息和发送消息在计算机上存储和传输的信息都是二进制,计算机只认识二进制的数,然后再通过某种方法转换为我们可以看到的信息,这种方法就是某种编码,通俗来讲就是密码本。
美国用的编码是ASCII码 中国用的是GBK编码,国际通用的编码就是Unicode编码,它们都是等长编码格式,也就是某个字符只占了2位比特而它必须来用这个特定的长度(其他位置用0表示)来表示这个字符,这样就非常浪费内存。
哈弗曼编码的特点就是变长编码格式,但是一般的变长编码格式解码人无法解码总会产生错误,但是哈夫曼编码解决了这个问题。
用哈夫曼树来产生哈夫曼编码来解决变长编码解码会产生错误的问题。
哈夫曼树的结构如下:
1.路径固定
2.权:也就是节点的值
3.带权路径长度:从根节点到该节点所经过路径的长度与该节点的权的乘积
4.树带权路径长度(WPL):从根节点叶子节点所经过路径长度与该节点权的乘积之和
5.最小哈夫曼树:WPL最小的树,通常用它来产生哈夫曼编码
6.每个节点的左路径用0表示,右路径用1表示
示例:I LOVE YOU用哈夫曼树来表示和每个字符的哈夫曼编码?
I LOVE YOU中空格出现了两次,O出现了两次所以空格和O的权是2,其他字符的权都是1,根据他们的权来构建最小哈夫曼树。
根据构建的最小哈夫曼树如下图:
每个字符编码如下:
I:000
L:001
V:010
E:011
U:100
Y:101
空格:110
O:111
这个例子比较特殊,构建出的编码是等长的,但是从上图也可以看到根据路径的0和1可以精准的找到某个字符,这样就压缩了等长编码的格式,节约了内存