一. 认识哈希表
- 将关心的内容转化为一个索引,然后直接用一个数组来存储相应的内容
- 由于数组是支持随机访问的,所以可以使用O(1)的时间复杂度来执行查找操作
- 哈希表充分体现了算法设计领域的经典思想:空间换时间
- 哈希表是时间和空间之间的平衡
- 对于我们所关心的内容,需要将其转化为一个“索引”,这个转化过程是通过 “哈希函数”完成的
- 哈希表中的两个关键问题:
- 将 “键” 通过通过一个合理的“哈希函数”转化为一个“索引”
- “键”比较复杂时,很难保证每个“键”都对应一个不同的索引,这是需要解决的问题就是 “哈希冲突” 问题
- “哈希函数”的设计是很重要的
- “键”通过哈希函数得到的“索引”分布越均匀越好
二. 哈希函数的设计
在哈希表中,“哈希函数”的设计是很重要的,一个好的哈希函数可以将“键”所映射出的“索引”分布得很均匀。在一些特殊领域,“哈希函数”的设计是比较复杂的,有专门的设计方式甚至是专门的设计论文。这里,主要关注一般的哈希函数的设计原则。
哈希函数设计原则:
- 一致性:如果a==b, 则hash(a) == hash(b);(注意,反过来不成立,即有可能出现:a != b, 但 hash(a) == hash(b), 此时就是所谓的“哈希冲突”问题)
- 高效性:计算高效便捷
- 均匀性:哈希值均匀分布
哈希函数一般的通用设计方法:
- 整型
- 对于小范围正整数,直接使用
- 对于小范围负整数,进行偏移,转化为正整数
- 对于大整数:(1)取模(对10000取模,相当于取大整数的后四位);(2)模一个素数<