赫夫曼树(Huffman树)及赫夫曼编码

版权声明:原创文章仅供大家学习使用,严禁转载 https://blog.csdn.net/qq_41809589/article/details/86563840

了解赫夫曼树前需要了解以下概念:

  • 路径:从树中某结点到另一结点之间的分支构成这两个结点间的路径。
  • 路径长度:路径上的分支数。
  • 结点的带权路径长度:从树根到该结点的路径长度与结点上权的乘积。
  • 树的带权路径长度:树中所有叶子结点的带权路径长度之和 (WPL)。
    例如:
    在这里插入图片描述

赫夫曼树(Huffman树):又称最优二叉树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。
Huffman给出构造最优二叉树的算法,具体构造赫夫曼算法的步骤如下:
⑴ 根据给定的 n 个权值{w1, w2, …, wn}构成 n 棵二叉树的集合 F ={T1, T2, …, Tn} ,其中每棵二叉树 Ti (1≤i≤n) 中只有一个带权为wi的根结点,其左右子树均空;
⑵ 在 F 中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。
⑶ 在F中删除这两棵树,同时将新得到的二叉树加入 F 中。  重复(2)和(3),直到 F 只含一棵树为止。这棵树便是所求的赫夫曼树。

例如: 已知权值 W={ 5, 6, 2, 9, 7 }
在这里插入图片描述
出现相同值得时候用哪一个生成新的二叉树都可以,所以赫夫曼树不是唯一的。
在这里插入图片描述
在这里插入图片描述
【赫夫曼编码】
赫夫曼编码:赫夫曼编码是一种变长编码,让使用频率高的字符编码短一些,能节省存储空间,加快数据的传输。等长编码解码时很方便,不会出现解码歧义问题,而变长编码就有可能会出现解码歧义问题。产生该问题的原因是某些字符的编码可能与其他字符的编码开始部分(称为前缀)相同。例如:设E、T、W分别编码为00、01、0001,则解码时无法确定信息串0001是ET还是W。
因此对字符集进行编码时,要求字符集中任一字符的编码都不是其余字符编码的前缀。 我们用Huffman树可以实现满足这种要求的编码,并且用这样的编码可以使得编码总长度最短。我们称这种编码为Huffman编码。

例如下题,并规定左子树指针为0,右子树指针为1。根据路径来确定字符的编码。
在这里插入图片描述
小结问题1:由n个叶子结点构成的赫夫曼树共有多少个结点?有多少度为2的结点?

  • n个结点经过n-1次合并,得到一棵赫夫曼树,每次和并得到一个新结点。 共计 : n + n-1 =2n -1。
  • 度为2的结点个数:n-1。

小结问题2:赫夫曼树有没有度为1的结点?

  • 没有,仅有度为2的结点和叶子结点,从而保证了解码不会出现歧义。

猜你喜欢

转载自blog.csdn.net/qq_41809589/article/details/86563840