【数据结构】hash冲突的解决方法

来源:互联网 发布:怎样下载打字软件 编辑:程序博客网 时间:2024/05/17 10:54

hash表的定义

  • 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key 对应一个存储位置f (key),对应关系f 称为散列函数, 又称为哈希( Hash) 函数

  • 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(hash table)

散列函数的构造方法

1.直接定址法

取关键字的某个线性函数值为散列地址

f ( key ) =a x key+b (a 、b 为常数)

2.数字分析法

使用关键字的一部分来计算散列存储位置的方法

3.平方取中法

平方后取中间的三位数,适合子不知道关键字的分布,而位数又不是很大的情况。

4.折叠法

  • 将关键字从左到右分割成位数相等的几部分(注意最后一部分位数不够时可以短些) ,然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。

  • 折叠法事先不需要知道关键字的分布,适合关键字位数较多的情况

5.随机数法

选择一个随机数,取关键字的随机函数值为它的散列地址

6.除留取余法

最常用的构造散列函数方法。对于散列裴长为m 的散列函数公式为:

f ( key) = key mod p (p <=m)

注:mod 是取模(求余数)的意思。这方法不仅可以对关键宇直接取模,也可在折叠、平方取中后再取模。,若散列表表长为m , 通常p 为小子或等于表长(最好接近m ) 的最小质数或不包含小子20 质因子的合数。

处理hash冲突的方法

1.开放定址法

一旦发生了冲突, 就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。公式如下

f, ( key ) = ( f ( key ) +dl ) MOD m (d,=1.2 ,3.. . …. .m-1 )

(1)线性探测法

(2)二次探测法(增加平方运算,避免堆积)

(3)随机探测法(位移量di采用随机函数计算得到)

2.再散列函数法

事先准备多个散列函数,每当发生散到地址冲突肘,就换一个散列函数计算,这样增加了计算的时间,比较低效。

3.公共溢出区法

将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,把所有冲突的关键字放入溢出表中。

4.链地址法

  • 将所有关键字为同义词的结点链接在同一个单链表中

  • 链地址法对于可能会造成很多冲突的散列函数来说,提供了绝不会出现找不到地址的保障。当然,这也就带来了查找时需要遍历单链表的性能损耗。

  • 链地址法的优点(与开放定址法相比)
    ①链地址法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
    ②由于链地址法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
    ③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而链地址法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
    ④在用链地址法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。

  • 链地址法的缺点:指针需要额外的空间,故当结点规模较小时,应使用开放定址法

这里写图片描述



本人才疏学浅,若有错,请指出
谢谢!

原创粉丝点击