散列(hash)表以及解决冲突的方式
把查找表中的关键字映射成该关键字对应地址的函数,散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为冲突,这些发生碰撞的不同关键字成为同义词。
1散列函数的构造方法
1)直接定址法
直接取关键字的摸个现行函数值为散列地址,散列函数为H(key)=a*key+b,其中a和b是常数,这种方法最简单,并且不会产生冲突,适合关键字分布基本连续的情况。
2)除留余数法
最简单,最常用,常用方法假设散列表长度为m,取一个不大于m但最接近或等于m的质数p,使用公式H(key)=key%p,除留余数法关键是选好p,是每一个关键字通过该函数转换后等概率地映射到散列空间上的任意地址,从而尽可能减少冲突的可能性
以上两种方法最常用,但还有数字分析法,平方取中法,折叠法
2处理冲突的方法
1)开放定址法
数学递推公式:H=(H(key)+d)%m 其中m表示散列表表长,d为增量序列,即步长。
①线性探测法:冲突发生时,顺序查看表中下一个单元,直到查找到一个空闲单元或者查表全表(当查找到表尾地址m-1时,下一个探测地址为表首地址0)
缺点:可以使第i个散列地址的同义词存入到第i+1个散列地址,这样本应该存入到第i+1个散列地址的元素就争夺第i+2个散列地址,从未造成大量的元素在相邻的散列地址堆积起来,大大降低了查找效率。
②平方探测法
d=1^2,-1^2,........,k^2,-k^2,其中K<=m/2,m必须是一个可以表示成4K+3的质数,又称二次探测法。
优缺点:可以避免堆积的产生,但是不能探测到散列表上所有的单元,但是至少能探测到一半单元。
③再散列法
使用两个散列函数,当第一个散列函数得到的地址发生冲突之后,利用第二个散列函数计算该关键字的地址增量。再散列法中,最多经过m-1次探测会表里表中所有位置
④伪随机序列法
当d=伪随机数序列,成为伪随机序列法
2)拉链法
如图所示,同样很简单...