向一个有k个地址的哈希表内依次置入元素直到首次发生冲突为止,元素个数的期望值计算

设哈希表采用均匀散列和闭散列法,地址空间大小为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<=nm
),
事件 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(X1X2Xi)=P(X1)P(X2∣X1)P(X3X1X2)P(XiX1Xi1)
= = = n − m n \frac{n-m}{n} nnm n − m − 1 n \frac{n-m-1}{n} nnm1 n − m − 2 n \frac{n-m-2}{n} nnm2 n − m − ( i − 1 ) n \frac{n-m-(i-1)}{n} nnm(i1)规定 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(Yi1Zi)=P(Yi1)P(ZiYi1)= 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} nnmnnm1nnm2nnm(i2)nm+i1
< = ( 1 − m n ) i − 1 m + i − 1 n <=(1-\frac{m}{n})^{i-1}\frac{m+i-1}{n} <=(1nm)i1nm+i1 ( 2 < = i < = n − m + 1 2<=i<=n-m+1 2<=i<=nm+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=2nm+1(i1)P(Yi1Zi)<=i=2nm+1(i1)(1nm)i1nm+i1
< = ∑ i = 1 n − m i ( 1 − m n ) i <=\sum_{i=1}^{n-m}{i(1-\frac{m}{n})^{i}} <=i=1nmi(1nm)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(1nm)nm(nm+1)(1nm)nm+1+(nm)2(1nm)2(1(1nm)nm)

记散列表的装载因子 α = 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=2nm+1(i1)(1nm)i1nm+i1
完全可以不放缩直接暴力计算,不过这样计算过程会变得冗长繁琐极易出错,这里就不算了

需要提及的一点是当 m = 0 m=0 m=0也就是装载因子 α = 0 \alpha = 0 α=0时以上部分推导过程仍然适用,只是最后的结果需要修改,这就留给读者思考了

最后需要说明一点 O ( N ( n , m ) ) O(N(n,m)) O(N(n,m))是上界估计,只有在 α \alpha α比较大才较精确,

α \alpha α较小时估计效果较差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值