一、哈夫曼树
哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树。在构建哈夫曼树时,给定N个权值作为N个叶子结点,通过特定的算法构造出一棵二叉树,使得这棵树的带权路径长度(WPL)达到最小。这里的“带权路径长度”是指树中所有叶结点的权值乘以其到根结点的路径长度之和。
基本概念:
路径和路径长度:在树中,从一个结点往下可以达到的孩子或孙子结点之间的通路称为路径。路径中分支的数目称为路径长度。若根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
结点的权:树结点中某种含义的数值称为结点的权。
带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。
性质:
哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 哈夫曼树的形态不是唯一的,但其带权路径长度WPL是唯一的。
构建过程:
构建哈夫曼树的过程通常包括以下几个步骤:
1、将给定的N个权值视为N棵只有根结点的二叉树(即森林),这N棵二叉树的根结点即为叶子结点。
2、在这些树中选择根结点权值最小的两棵树进行合并,生成一棵新的二叉树,其根结点的权值为这两棵树根结点权值之和。
3、将新生成的二叉树加入森林中,同时删除那两棵权值最小的树。 重复步骤2和3,直到森林中只剩下一棵树,这棵树即为所求的哈夫曼树。
二、哈夫曼编码
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种可变字长编码(VLC)方式。它基于哈夫曼树进行构造,利用字符出现的频率作为权值,通过构建哈夫曼树来生成平均码长最短的编码。
基本原理:
根据字符出现的频率构建哈夫曼树。 在哈夫曼树中,从根结点到每个叶子结点的路径上的左、右分支分别用0和1表示,从而得到每个字符的编码。 字符出现频率越高,其编码长度越短;字符出现频率越低,其编码长度越长。
应用:
哈夫曼编码广泛应用于数据压缩领域。通过减少编码的平均长度,可以有效地降低数据存储和传输的开销。例如,在JPEG图像压缩中,就使用了类似哈夫曼编码的方法来对图像数据进行压缩。