经典算法问题:赫夫曼树以及赫夫曼编码

是能使得给定的字符串编码成 0 1 串后长度最短的前缀编码。

1、编码问题:ASCII 码:一共 128 个:http://tool.oschina.net/commons?type=4

2、前缀码:前缀唯一

3、频率越高,编码越短

4、等长编码与不等长编码

5、构建出二叉树,左分支走 0 ,右分支走 1

6、非叶子结点上出现前缀,没有二义性

7、WLP 值一样。

参考资料:

《大话数据结构》

算法导论第 200 页:

殷人昆《数据结构》

赫夫曼树以及赫夫曼编码

1、有多分支的时候,将常用的分支靠前,可以减少判断的次数,以提高效率,但是这样做需要对数据的分布有所了解,即要知道数据的频数;
2、应用于文件压缩,具体:重新编码(Huffman 编码),以减少存储和传输的空间大小;
3、 Huffman 编码的基本思想,频数较多的靠前,类似与我们总是将常用的文字,设计成笔画较少,生僻字的笔画往往较多且复杂;
4、Huffman 树的特点:叶子结点带权,这个权就是我们上面说的频数;
5、一些定义:

(1)结点的路径长度:
(2)树的路径长度:不限制是否是叶子结点
(3)树的带权路径长度:所有叶子结点
(4)树的带权路径长度 WPL:WPL 最小的二叉树称之为 Huffman 树,或者说是最优二叉树

可以构造出不同的 Huffman 树(想到构造的过程其实是贪心算法,我们总是希望权值小的结点出现在较高的地方),但是 WLP 一定是一样的。

具体例子:
依据频数编码,将频数视为权值

前缀码:其实是反过来定义的,即不可能成为其它码的前缀的码,类比 Trie ,这是为了保证编码的唯一性,避免二义性。

左分支代表 0 ,右分支代表 1。

解码:(非等长编码)

发送方和接收方,必须要有同样的 Huffman 树。

参考资料
1、《大话数据结构》
2、《算法导论》
3、灯笼大神的动态 Huffman 编码 Adaptive Huffman Encoding

你可能感兴趣的:(经典算法问题:赫夫曼树以及赫夫曼编码)