数据结构 - 哈夫曼编码

二叉树的一个重要应用就是哈夫曼编码惹,

首先,哈夫曼编码是什么
百度百科答:哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。
总结,哈夫曼编码是一种编码方式

那么,哈夫曼编码和二叉树有什么关系呢
回答:哈夫曼编码式基于二叉树来实现的,回顾一下哈夫曼先生发明这个编码方式的过程:1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。由于这个算法,学生终于青出于蓝,超过了他那曾经和信息论创立者香农共同研究过类似编码的导师。哈夫曼使用自底向上的方法构建二叉树,避免了次优算法Shannon-Fano编码的最大弊端──自顶向下构建树。

然后,哈夫曼编码用来做什么的
回答:其实上面已经讲了,最有效的二进制编码方式,也就是说,根据字符出现的次数(或者说频率),来改变字符的编码长度,从而使字符的二进制编码达到最优的效果。简而言之,就是构造最短的不等长编码方案。

让我们来看看他到底是怎么实现的,先–>纸上谈兵一下(懂了原理之后再贴代码- -)

先看一下编码结束后的结果:
哈夫曼编码

(编码得到的这棵树叫做哈夫曼树。----->对树来讲叶子节点的权值是对叶子节点赋予的一个有意义的数值量,这里就是字符出现的次数。设二叉树具有 n 个带权值的叶子结点,从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度。给定一组具有确定权值的叶子结点,可以构造处不同的二叉树,将其中带权路径长度最小的二叉树称为哈夫曼树。)

规定哈夫曼编码树的作分支代表 0,右分支代表 1,则从根结点到每个叶子结点所经过的路径组成的 0 和 1 的序列便成为该叶子结点对应字符的编码。

其实构造完这个树,就解决了很多问题,所以现在就该解决↓怎么构造这个树

以图会友:
建树1

建树2

建树3

建树4

建树5
讲道理的话就是这个样子:
过程

打代码的话就是这个样子:
(代码预留位)

先放个结果图= =
结果

发布了106 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44702847/article/details/103016061
今日推荐