622 字
3 分钟
图论算法其三:树的简单应用
1.哈夫曼树
1.1.哈夫曼编码
通常的编码方法有定长编码和不定长编码两种,编码的目的是寻找合适的编码方案使总码长度最短。定长编码常常采用类似哈希的方案,不定长编码则会尽可能使常用的字符编码短,不常用的字符编码长,同时保持无二义性。
1952年,数学家D.A.Huffman提出了一种基于哈夫曼树的编码方法,这棵树将被编码字符作为叶子节点,将该字符的使用频率作为权值反复合并,最后构成一棵树,从根到叶子节点的路径即为其编码。
1.2.原理
- 二叉树上每条路径上的每条边都只有两种状态,可用
0
或1
表示 - 二叉树上每个叶子节点到根的路径唯一
- 二叉树上每个叶子节点到根的路径不会经过其他叶子节点
- 叶子节点深度即为对应的编码长度
1.3.构造
- 首先以使用频率为权值确定个字符对应的个叶子节点,构成棵树组成的森林
- 接着循环次,每次合并权值最小的两个根节点,合并后的节点为新的根节点,连接原来的两个节点,权值为原来的两个结点之和
- 最后产生的树即为哈夫曼树
1.4.拓展:哈希表
1.4.1.散列函数(哈希函数)
是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
应用:
- 消息摘要
- 散列表(哈希函数)
常见散列函数:
- MD5
- SHA
1.4.2.散列函数设计
散列函数设计要遵循以下两个原则:
- 尽可能简单
- 尽可能均匀分布以减小冲突
1.4.3.常见散列方法
- 直接定址法
- 除留余数法
- *随机数法
- *数字分析法
- *平方取中法
- *折叠法
- *基数转换法
- *全域散列法