设哈希表采用均匀散列和闭散列法,地址空间大小为n,已存在哈希表中的元素数目为m
定义事件
X
i
X_i
Xi表示第
i
i
i次散列未发生冲突,事件
Y
i
Y_i
Yi表示前i次散列未发生冲突(这里
1
<
=
i
<
=
n
−
m
1<=i<=n-m
1<=i<=n−m
),
事件
Z
i
Z_i
Zi表示第i次散列发生冲突
于是
P
(
Y
i
)
=
P
(
X
1
X
2
−
−
−
X
i
)
=
P
(
X
1
)
P
(
X
2
∣
X
1
)
P
(
X
3
∣
X
1
X
2
)
−
−
−
P
(
X
i
∣
X
1
−
−
−
X
i
−
1
)
P(Y_i) = P(X_1X_2---X_i) = P(X_1)P(X2|X1)P(X_3|X_1X_2)---P(X_i|X_1---X_{i-1})
P(Yi)=P(X1X2−−−Xi)=P(X1)P(X2∣X1)P(X3∣X1X2)−−−P(Xi∣X1−−−Xi−1)
=
=
=
n
−
m
n
\frac{n-m}{n}
nn−m
n
−
m
−
1
n
\frac{n-m-1}{n}
nn−m−1
n
−
m
−
2
n
\frac{n-m-2}{n}
nn−m−2—
n
−
m
−
(
i
−
1
)
n
\frac{n-m-(i-1)}{n}
nn−m−(i−1)规定
P
(
Y
0
)
=
1
P(Y_0)=1
P(Y0)=1
P
(
Y
i
−
1
Z
i
)
=
P
(
Y
i
−
1
)
P
(
Z
i
∣
Y
i
−
1
)
=
P(Y_{i-1}Z_i) = P(Y_{i-1})P(Z_i|Y_{i-1})=
P(Yi−1Zi)=P(Yi−1)P(Zi∣Yi−1)=
n
−
m
n
n
−
m
−
1
n
n
−
m
−
2
n
−
−
−
n
−
m
−
(
i
−
2
)
n
m
+
i
−
1
n
\frac{n-m}{n}\frac{n-m-1}{n}\frac{n-m-2}{n}---\frac{n-m-(i-2)}{n}\frac{m+i-1}{n}
nn−mnn−m−1nn−m−2−−−nn−m−(i−2)nm+i−1
<
=
(
1
−
m
n
)
i
−
1
m
+
i
−
1
n
<=(1-\frac{m}{n})^{i-1}\frac{m+i-1}{n}
<=(1−nm)i−1nm+i−1 (
2
<
=
i
<
=
n
−
m
+
1
2<=i<=n-m+1
2<=i<=n−m+1)
而
P
(
Z
1
)
=
m
n
P(Z_1) = \frac{m}{n}
P(Z1)=nm
于是向一个地址空间大小为n,且已装有m个元素的哈希表依次放入元素直到首次发生冲突为止,
放入元素的期望数
N
(
n
,
m
)
=
N(n,m)=
N(n,m)=
P
(
Z
1
)
0
+
∑
i
=
2
n
−
m
+
1
(
i
−
1
)
P
(
Y
i
−
1
Z
i
)
<
=
∑
i
=
2
n
−
m
+
1
(
i
−
1
)
(
1
−
m
n
)
i
−
1
m
+
i
−
1
n
P(Z_1)0+\sum_{i=2}^{n-m+1}{(i-1)P(Y_{i-1}Z_i)}<=\sum_{i=2}^{n-m+1}{(i-1)(1-\frac{m}{n})^{i-1}\frac{m+i-1}{n}}
P(Z1)0+∑i=2n−m+1(i−1)P(Yi−1Zi)<=∑i=2n−m+1(i−1)(1−nm)i−1nm+i−1
<
=
∑
i
=
1
n
−
m
i
(
1
−
m
n
)
i
<=\sum_{i=1}^{n-m}{i(1-\frac{m}{n})^{i}}
<=∑i=1n−mi(1−nm)i
=
(
1
−
m
n
)
m
n
−
(
n
−
m
+
1
)
(
1
−
m
n
)
n
−
m
+
1
m
n
+
(
1
−
m
n
)
2
(
1
−
(
1
−
m
n
)
n
−
m
)
(
m
n
)
2
=\frac{(1-\frac{m}{n})}{\frac{m}{n}}-\frac{(n-m+1)(1-\frac{m}{n})^{n-m+1}}{\frac{m}{n}}+\frac{(1-\frac{m}{n})^{2}(1-(1-\frac{m}{n})^{n-m})}{(\frac{m}{n})^2}
=nm(1−nm)−nm(n−m+1)(1−nm)n−m+1+(nm)2(1−nm)2(1−(1−nm)n−m)
记散列表的装载因子
α
=
m
n
\alpha=\frac{m}{n}
α=nm
则
O
(
N
(
n
,
m
)
)
=
(
1
−
α
)
α
−
(
n
(
1
−
α
)
+
1
)
(
1
−
α
)
n
(
1
−
α
)
+
1
α
+
(
1
−
α
)
2
(
1
−
(
1
−
α
)
n
(
1
−
α
)
)
(
α
)
2
O(N(n,m)) = \frac{(1-\alpha)}{\alpha}-\frac{(n(1-\alpha)+1)(1-\alpha)^{n(1-\alpha)+1}}{\alpha}+\frac{(1-\alpha)^{2}(1-(1-\alpha)^{n(1-\alpha)})}{(\alpha)^2}
O(N(n,m))=α(1−α)−α(n(1−α)+1)(1−α)n(1−α)+1+(α)2(1−α)2(1−(1−α)n(1−α))
上式还可以继续化简,这里略去 另外
∑
i
=
2
n
−
m
+
1
(
i
−
1
)
(
1
−
m
n
)
i
−
1
m
+
i
−
1
n
\sum_{i=2}^{n-m+1}{(i-1)(1-\frac{m}{n})^{i-1}\frac{m+i-1}{n}}
∑i=2n−m+1(i−1)(1−nm)i−1nm+i−1
完全可以不放缩直接暴力计算,不过这样计算过程会变得冗长繁琐极易出错,这里就不算了
需要提及的一点是当 m = 0 m=0 m=0也就是装载因子 α = 0 \alpha = 0 α=0时以上部分推导过程仍然适用,只是最后的结果需要修改,这就留给读者思考了
最后需要说明一点 O ( N ( n , m ) ) O(N(n,m)) O(N(n,m))是上界估计,只有在 α \alpha α比较大才较精确,
当 α \alpha α较小时估计效果较差