算法导论 练习11.5-1

假设采用了开放寻址法和均匀散列技术将n个关键字插入到一个大小为m的散列表中。设p(n,m)为没有冲突发生的概率。试证明:p(n,m) \le e^{\frac{-n(n-1)}{2m}}。(提示:见式(3.12)。)论证当n超过\sqrt{m}时,不发生冲突的概率快速趋近于0。

对于所有实数x,我们有不等式 e^{x} \ge 1 + x        (3.12)

稍作变形,对x大于-1时在两边以e为底取对数有 x \ge ln(1 + x)

不难推算将n个关键字插入到一个大小为m的散列表中,不发生冲突的概率为:

p(n, m) = \frac{m}{m} \cdot \frac{m-1}{m} \cdot \frac{m - 2}{m} \cdot ... \cdot \frac{m - (n - 1)}{m}

对其取以e为底的对数有:

ln(p(n,m)) = ln(1 - \frac{1}{m}) + ln(1 - \frac{2}{m}) + ... + ln(1 - \frac{n - 1}{m})

结合上述式(3.12)变形,有:

ln(p(n, m)) \le (-\frac{1}{m}) + (-\frac{2}{m}) + ... + (-\frac{n-1}{m}) 即 ln(p(n,m)) \le -\frac{n(n-1)}{2m}

因此 p(n, m) \le e^{-\frac{n(n-1)}{2m}}

然而不发生冲突的概率快速趋近于0令人费解

为方便说明选取m = 1000对其进行作图

import matplotlib.pyplot as plt
import math

def prod(n, m = 1000):
    res = 1
    for i in range(1, n):
        res *= (1 - n / m)
    return res

x = list(range(1, 1000))
y = [prod(i) for i in x]
z = [math.e**(-i * (i - 1) / 2000) for i in x]

plt.plot(x, y, label = 'real')
plt.plot(x, z, label = 'limit')
plt.legend()
plt.show()

 

 对函数f(n) = e^{-\frac{n(n-1)}{2m}}分别求一次、二次导数得到:

f'(n) =\frac{1-2n}{2m}e^{-\frac{n(n-1)}{2m}}        f''(n) = \frac{(2n-1)^2 - 4m}{4m^2}e^{-\frac{n(n-1)}{2m}}

大致可以认为 n = \sqrt m是函数拐点,超过后函数值趋近于0,但并不快速

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值