1. 直接定址法
哈希函数为关键字的线性函数
H(key) = key 或者 H(key) = a ´ key + b
特点:地址集合的大小 = 关键字集合的大小
2.除留余数法(最常用)
构造:取关键字被某个不大于哈希表表长 m 的数 p 除后所得余数作哈希地址,即 H(key) = key MOD p, p <= m。
特点:简单,可与上述几种方法结合使用。 p 的选取很重要;p 选得不好,容易产生同义词
给定一组关键字:12, 39, 18, 24, 33, 21,若取 p = 9, 则他们对应的哈希函数值将为: 3, 3, 0, 6, 6, 3
处理冲突的方法
1.“处理冲突”的实际含义是:为产生冲突的地址寻找另一个哈希地址。
为产生冲突的地址 H(key) 求得一个探查地址序列: H0, H1, H2, …, Hs 1≤s≤m - 1
2.其中:Hi = ( H(key) + di ) MOD m i =1, 2, …, s 沿此序列逐个地址探查,直到找到一个空位置(开放的地址), 将发生冲突的记录放到该地址中。
3.对增量 di 有三种取法:
线性探测再散列:di = 1, 2, 3, …, m-1
二次探测再散列(平方探测再散列 ):di = 1², -1², 2², -2², 3², …, ±k² (k £ m/2)
伪随机探测再散列(双散列函数探测再散列 ):di = 伪随机数序列
例:表长为 11 的哈希表中已填有关键字为 17,60,29 的记录, H(key)=key MOD 11,现有第 4 个记录,其关键字为 38,按三种处理冲突的方法,将它填入表中
H1=(5+1) MOD 11=6 冲突
H2=(5+2) MOD 11=7 冲突
H3=(5+3) MOD 11=8 不冲突
H1=(5+1²) MOD 11=6 冲突
H2=(5-1²) MOD 11=4 不冲突
设伪随机数序列为 9,则:
H1=(5+9) MOD 11=3 不冲突