散列表(哈希表)查找

今天学习了散列表也就是哈希表的内容

为什么我们需要hash表呢?

设想这种情况,假设我们去找某位同学,我们去拿着学生名单表一一对照,然后找到了同学

如果我们去直接问班主任,我们要找的同学在那里,班主任可以直接带我们找到这位同学

我们的散列表就类似这种功能

我们可以通过某个公式来找到相应的存储位置

存储位置=f(关键字)

这样我们不需要比较就能获得需要记录的存储位置,这种技术就成为散列技术

散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。

f称为散列函数,又称为哈希函数,按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或哈希表。

散列表适合查找一给定值相等的记录

不适合范围查找和对应很多记录的情况

问题:如果我们使用不同的键通过相同的散列函数得到了相同的记录,那么我们要如何解决这种冲突

处理散列冲突的方法:

1.开放定址法/线性探测法:一旦冲突,就去寻找下一个空的散列地址,只要散列表足够大,总能找到空的地址,并将记录存入

它的公式是:

f(key)=(f(key)+di) MOD m(di=1,2,3,4,5,6.......m-1)

这种方法可能有两种缺陷,我们di取值不断增加时,我们不断的取余数得到结果,但是效率很差,我们可以将di变为双向索引,

就是di=1,-1,2,-2,3,-3.。。。。。。

第二个问题是如果增量为1,那么记录都会聚集在某一块去榆中,我们将增量变大,

综合上面两种情况我们改变公式如下:

f(key)=(f(key)+di) MOD m(di=1^2,,-1^2,2^2,-2^2,3^2,-3^2,.......q^2,-q^2,q<=m/2)

还有种方法:

在冲突时我们可以对位移量di采用随机函数计算得到,我们称之为随机探测法。

这里通过随机函数获得随机数是要通过相同的种子,这样得到的随机数在相同种子下是相通的,便可以完成查找

2.再散列函数法:

   公式如下fi(key)=RHi(key)(i=,1,2,3.....k)

RHi就是不同的散列函数,每当散列地址冲突时,我们就换一个散列函数计算

3.链地址法:

我们将所有关键字为同义词的记录存储在一个单链表,我们称这种表为同义词子表,在散列表中只存储所有同义词子表的头指针,那么不存在地址冲突和找不到地址

4.公共溢出区法:

凡是冲突的关键字建立一个公共的溢出区来存放。在查找时,通过散列函数计算出散列地址,然后进行对比,如相等则成功,如果不相等则到溢出表顺序查找,当冲突很少,这种效率很高。 

猜你喜欢

转载自blog.csdn.net/Sunmeok/article/details/81914224