2022考研408-哈希查找


哈希表

哈希表定义

l  哈希表(Hash table,也叫散列表),是根据关键码值 (Key value)而直接进行访问的数据结构。 也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。 这个映射函数叫做散列函数,存放记录的数组叫做散列表

散列函数

l  直接定址法: H(key)=a*key+b,可以保证不冲突,但散列表表长依赖于关键字值,具有随意性。

l  除素取余:H(key) = key mod p,其中p往往取素数

l  平方取中

l  数字分析

l  。。。 。。。

冲突处理

l  开放定址法——允许关键字存入非匹配位置

Addr = Hash(Key),若Addr处已有元素占位,那么通过一个增量序列d1, d2, … …

向前探测,即Addr = Addr + di (i=1, 2, … …),直到找到一个空位。在查找时,先计算Hash(Key)得到Addr,若散列表Addr处为空,则查找失败,否则作第一次比较,若相等,查找成功,否则依据di向前探测,直到查找到该值(查找成功)或查到一个空缺(查找失败)由此可见,在散列表中不可以随便删除一个元素,因为这样可能导致断链,可以采用标记法,这时应不定期的进行物理调整。

       Hi = (Hash(Key) + di)%m (m为表长)

线性探测法:{ di } = { 0, 1, 2, 3, … … },也即每次向前看一个位置,这种方法可能造成聚集现象,增大平均查找长度

平方探测法(二次探测法):{ di } = { 0, 1, -1, 4, -4, 9, -9, … … , k^2, -k^2}其中k<=m/2,m是可以表示为 m = 4*k + 3的素数,优点是避免了堆积问题,缺点是无法探测到所有单元

再散列法:使用Hash2(Key)作为di的值,di = i*Hash2(key)

l  链接法

n  将冲突的元素组成一个链表

例题

1、 设记录的关键字集合K = { 24,15,39,26,18,31,05,22},哈希表表长m=16,哈希函数H(key) = Key % 13,冲突处理策略为“二次探测法”。请依次取K中各元素构造哈希表并求等概率条件下查找成功的平均查找长度。

解:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

39

26

15

31

18

22

24

24%13 = 11,直接插入       15%11=4,直接插入         

39%13=0,直接插入          26%13=0,冲突,di=1, (26+1)%16=1

18%13=6,直接插入           31%13=5,直接插入

05%13=5,冲突,d1=1, (05+1)=6,冲突,di=-1,(05-1)=4,冲突,di=4,5+4 = 9, 不冲突,

22%13=8, 不冲突,直接插入

根据以上插入过程,则平均查找长度

为:(1+1+1+2+1+1+4+1+1)/8 = 1.5