海量数据处理技术(1): 散列技术
Hash,音译“哈希”,也称为散列表。它是将任意的输入通过映射函数映射到一个指定的输出空间。该映射函数函数称为hash函数,指定的输出空间称为hash表。通常是将一个大的数据集映射到一个小的数据集上。hash技术常用于字典或数据库等key-value系统中,将Key通过hash函数映射到hash表中,然后在该映射位置存储value的值(或者存储指向value的指针),这样在查找时,便只需对key进行hash一次便得到了它对应的value存储的位置。hash的一般映射关系如下,并维基百科上借用张图来说明下:
h:key→T{0,1,2...,m−1}
查找复杂度
- 在一些合理的假设下,在散列表中查找一个元素的的期望时间为 O(1)
- 最坏的情况下,查找一个元素的时间为 O(n) ,在所有的key都映射到一个地址上面了,此时hash表的性能和链表一样。
它有如下的特点:
- 对于不同关键字可能得到相同的散列地址,即 key1≠key2 存在 h(key1)=h(key2) ,这 种情况叫做冲突Collision。每一个hash函数都可能出现这种情况,所以在设计时必须考虑如何解决冲突处理。
- 同一hash函数,对于不同的散列地址其关键字一定不同。
(1) hash函数的构造
好的hash函数一般有如下的特点:
- 一个好的hash函数应(近似地)满足简单一致散列的假设,即每个关键字都等可能地散列到m个槽位的任何一个中去,并与其他的关键字已被散列到哪个个槽为无关。
- 一个好的hash函数应能最小化将这些相近的符号散列到同一个槽中的可能性,比如pt和pts的散列值要经可能的不一致,而不要相同。
(1.1) 直接寻址法
(1.2) 除法散列法
(1.3) 乘法散列法
(1.4) 全域散列法
(2) hash函数冲突处理
(2.1) 开放寻址法
- 线性探查
- 二次探查
- 双重散列