开放定值法:
也叫再散列法,当关键字
key
的哈希地址p=H(key)
出现冲突时,以p
为基础,产生另一个哈希地址p1
,如果p1
仍然冲突,再以p
为基础,产生另一个哈希地址p2,…,
直到找出一个不冲突的哈希地址pi
,将相应元素存入其中。通常都是用以下公式计算:
Hi=(H(key)+di)% m i=1,2,…,n
其中
H(key)
为哈希函数,m
为表长,di
称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。主要有三种:线性探测再散列(冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表),二次探测再散列(冲突发生时,在表的左右进行跳跃式探测,直到找到空单元),伪随机探测再散列。链地址法:
这种方法的基本思想是将所有哈希地址为
i
的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i
个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。像之前看到的HashMap
就是利用这种方法解决Hash冲突的。再哈希法:
多写几个哈希函数,算出来一个
hashcode
重复的就用另一个哈希函数算,直到算出来不一样。建立一个公共溢出区域,就是把冲突的都放在另一个地方,不在表里面。