1.冲突处理方法一---开放地址法
当发生地址冲突后,求解下一个地址用:
ND =( D+di)%mi=1,2,…,k(k<= m-1)
其中: m为哈希表长度,di为增量序列。增量序列的不同取法,又构成不同的开放地址法。
(1)线性探测再散列
D = H(key);
ND = (D+di)%m;di取1,2,3,……,m-1
线性探测再散列处理冲突的基本思想:若数据元素在存储地址D发生冲突,则放到存储地址(D+1)%m;若又发生冲突则放到存储地址(D+2)%m;若再发生冲突则放到存储地址(D+3)%m;……;直到碰到第一个为空的存储地址(D+i)%m,则将数据元素存放在该存储空间。
(2)二次探测再散列
D = H(key);
ND = (D+di)%m;di取1*1,-1*1,2*2,-2*2,……,K*K,-K*K (K≤m/2)
(3)双散列法
首先使用第一个散列函数H1(key)及逆行那个散列,一旦发生冲突,则使用第二个函数H2(key)计算改项到达下一个存储地址的增量,其取值p和key有关,范围在1和m之间,并且与m互质的正整数。
D = H1(key);
p = H2(key);
ND = (D+p)%m;
值得提醒的是,对利用开放地址法查了冲突所产生的哈希表中删除一个元素,不能简单地直接删除,因为这样将截断其它具有相同哈希地址的元素的查找地址,所以应设定一个特殊的标志以表明该元素已被删除。