01 开放定址法
也被称为再散列法。基本思想是:当关键字key的哈希地址p出现冲突时,以p为基础产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础产生p2,……,直到找到一个不冲突的哈希地址pi,将相应元素存入其中。这种方法有一个通用的再散列函数形式:
Hi = (H(key)+di)%m (i=1,2,3,……)
其中H(key)为哈希函数,m为表长,di称为增长序列。
增长序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:
- 线性探测再散列——冲突发生时,顺序查看表中下一单元,直到找出一个空单元或者查遍全表。
缺点:容易造成元素聚集,降低查找效率
- 二次探测再散列——冲突发生时,在表的左右进行跳跃式探测,比较灵活。
优点:避免堆积问题 缺点:不能探测表中的所有元素,但至少能探测到一半的元素
- 伪随机探测再散列
缺点:用同样的随机种子,将得到相同的散列。
02 再哈希法
这种方法是同时构造多个不同的哈希函数,当第一个函数发生冲突时,再计算第二个函数,……,直到冲突不再发生。这种方法不易产生聚集,但增加了计算时间。
03 链地址法
该方法基本思想是将所有的哈希地址为i的元素构成一个同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入、删除主要在同义词链中进行。该方法适用于经常进行插入和删除的情况。
优点:避免了动态调整的开销
04 建立公共溢出区
将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。