1、链地址法
原理:对于hash值相同的,用链表连接存储。
优点
1)适用总数经常变化的情况(因为链表中各结点是动态申请的)。
2)删除结点操作易于实现,只要简单地删去链表上相应的节点即可。
3)处理冲突简单,无堆积现象。
缺点
1)查询效率较低。(存储是动态的,查询时跳转需要更多的时间)
2)不容易序列化。
2、再哈希法
提供多个哈希函数,如果第一个哈希函数计算出来key的哈希值冲突了,则使用第二个哈希函数计算key的哈希值。
优点:不易产生聚集。
缺点:增加计算时间。
3、建立公共溢出区
将哈希表分为基本表和溢出表,凡是和基本表发生冲突的元素,一律填入溢出表。
4、开放定址法
当关键字key的哈希地址p=H(key)发生冲突,以p为基础,产生另一个哈希地址p1,若p1仍然冲突,再以p1基础,计算出p2,以此类推,则到pi不冲突。
即 Hi = (H(key) + di) % m (i = 1, 2, 3 ... n)
开放地址发有三种方法:线性探测再散列、二次(平方)探测再散列、伪随机探测再散列。
优点
1)容易序列化。
2)若预知数据总数,可以创建完美哈希序列。
缺点
1)占空间很大。
2)删除结点很麻烦。不能简单地将被删结点的空间置为空,因为空地址单元都是查找失败的条件。