哈希函数:
H
(
k
e
y
)
:
K
→
D
,
k
e
y
∈
K
H(key):K\to D,key\in K
H(key):K→D,key∈K
冲突:不同关键字的哈希函数可能相同,即
H
(
k
e
y
1
)
=
H
(
k
e
y
2
)
,
k
e
y
1
≠
k
e
y
2
H(key_1)=H(key_2),key_1\ne key_2
H(key1)=H(key2),key1=key2这种现象称为冲突,
k
e
y
1
,
k
e
y
2
key_1,key_2
key1,key2称为同义词。😻
哈希表:假设有8个关键字
22
,
41
,
53
,
46
,
30
,
13
,
12
,
67
22,41,53,46,30,13,12,67
22,41,53,46,30,13,12,67,地址区间长度为
11
11
11,哈希函数为
H
(
k
e
y
)
=
k
e
y
%
11
H(key)=key\%11
H(key)=key%11
若处理冲突方式为链地址法,如图
若处理冲突方式为线性探测法,如图
二、哈希函数的部分构造方法
1. 直接定址法
哈希函数:
H
(
k
e
y
)
=
a
×
k
e
y
+
b
H(key)=a\times key+b
H(key)=a×key+b其中
a
a
a为缩放系数,
b
b
b为平移系数。😸
函数定义:
inthash_d(int key){return a*key+b;}
2. 除留余数法
哈希函数:
H
(
k
e
y
)
=
k
e
y
%
p
(
p
≤
m
)
H(key)=key\%p(p\le m)
H(key)=key%p(p≤m)其中
m
m
m是哈希表的长度,
p
p
p最好取不大于
m
m
m的素数。😺
线性探测法:
H
i
=
(
H
(
k
e
y
)
+
i
)
%
m
,
1
≤
i
≤
m
−
1
H_i=(H(key)+i)\%m,1\le i\le m-1
Hi=(H(key)+i)%m,1≤i≤m−1
二次探测法:
H
i
=
(
H
(
k
e
y
)
+
d
i
)
%
m
,
1
≤
i
≤
m
−
1
H_i=(H(key)+d_i)\%m,1\le i\le m-1
Hi=(H(key)+di)%m,1≤i≤m−1其中
d
i
=
1
,
−
1
,
2
2
,
−
2
2
,
…
k
2
,
−
k
2
(
k
≤
m
/
2
)
d_i=1,-1,2^2,-2^2,\ldots k^2,-k^2(k\le m/2)
di=1,−1,22,−22,…k2,−k2(k≤m/2)