Hash表处理冲突的方法

1.开放定址

线性探测
Hi=(Hash(key)+di) mod m ( 1≤i < m )
其中:
Hash(key)为哈希函数
m 为哈希表长度
di 为增量序列1,2,……,m-1,且di=i
二次探测
Hi=(Hash(key)±di) mod m
其中:
Hash(key)为哈希函数
m 为哈希表长度,m 要求是某个4k+3 的质数(k 是整数)
di 为增量序列12,-12,22,-22,……,q2,-q2 且q≤1/2 (m-1)
双哈希函数
Hi=(Hash(key)+i*ReHash(key)) mod m (i=1,2,……,m-1)
其中:
Hash(key),ReHash(key)是两个哈希函数,
m 为哈希表长度

2.拉链法

设哈希函数得到的哈希地址域在区间[0,m-1]上,以每个哈希地址作为一个指针,指向一个链,即分配指针数组ElemType eptr[m];建立m 个空链表,由哈希函数对关键码转换后,映射到同一哈希地址i 的同义词均加入到eptr[i]指向的链表中。

3.建立一个公共溢出区

设哈希函数产生的哈希地址集为[0,m-1],则分配两个表:
一个基本表ElemType base_tbl[m];每个单元只能存放一个元素;
一个溢出表ElemType over_tbl[k];只要关键码对应的哈希地址在基本表上产生冲突,则所有这样的元素一律存入该表中。查找时,对给定值kx 通过哈希函数计算出哈希地址i,先与基本表的base_tbl[i]单元比较,若相等,查找成功;否则,再到溢出表中进行查找。

发布了32 篇原创文章 · 获赞 0 · 访问量 606

猜你喜欢

转载自blog.csdn.net/qq_28133013/article/details/104377736