天天看点

散列表查找

定义

通过散列函数寻找某个关键字所存在的位置,利用散列技术存储在一块连续的存储空间中,这块连续的存储空间称为散列表,对应的存储位置成为散列地址。

散列表查找

冲突

在查找存储位置的时候会存在关键字不同,但是存储位置相同,即对应的散列函数值相同,这种情况即“冲突”。

散列函数的构造

散列函数有很多构造方法,比如直接定址法、除留余数法等等,但不是都适用,因此好的散列函数应该具有:计算简单、散列地址分布均匀的特点

构造方法

  • 直接定址法

    这个方法比较直接,就和它的名字一样,直接。比如年龄统计,一个年龄为66的人,那函数就可以直接以66为值。

  • 平方取中法

    一个值为1234的关键字,sqrt(1234)=1522756,在取最后三位即756作为散列地址。这种方法造成冲突的概率比较大。

  • 除留余数法(最常用)

对表长为m,关键字为x的散列函数公式可以表示为:f(x)= x mod p(p<=m),为了尽量避免冲突,选好p是关键。通常选取p为小于等于表长m的最小质数。

处理散列冲突

f(x)= x mod p;就比如x=37、47,p等于12的时候,37是不是就和47冲突了,所以就要处理冲突来使散列地址发布均匀。

可以做一下改变:

散列表查找

这样f(37)=1,而f(32)=2就避免了冲突,但是光这样无法达到均匀分布,所以可以改善一下di数组:

散列表查找

继续阅读