算法导论 练习11.4-5

考虑一个装载因子为α的开放寻址散列表。找出一个非零的α值,使得一次不成功查找的探查期望数是一次成功查找的探查期望数的2倍。这两个探查期望可以使用定理11.6和定理11.8中给定的上界。

首先是参考了CLRS答案里Lambert W函数的解法,主要是补充一下细节部分

依题意对 \frac{1}{1-\alpha } = \frac{2}{\alpha}ln\frac{1}{1-\alpha} 进行求解

首先进行替换 1 - \alpha = e^{x},即 \alpha = 1 - e^{x},原方程化简得到:1 = (1 - 2x)e^{x}

两边同时乘 \frac{1}{2},再除以e^{\frac{1}{2}},得到:\frac{1}{2}e^{-\frac{1}{2}}=(\frac{1}{2} - x)e^{x - \frac{1}{2}},即:(x - \frac{1}{2})e^{x - \frac{1}{2}} = -\frac{1}{2}e^{-\frac{1}{2}}

此时已经满足Lambert W函数的求解形式了(xe^{x} = t),因此:

x = \frac{1}{2} + W(-\frac{1}{2}e^{-\frac{1}{2}}),于是 \alpha = 1 - e^{x} = 1 - e^{\frac{1}{2} + W(-\frac{1}{2}e^{-\frac{1}{2}})}

这里可以看出有一个解是 x = 0,但需要的不是这个而是 W_{-1}

借助网站wolframalpha,解得α约为0.7153

 其实一般可以作图来达到近似的效果

import math
import matplotlib.pyplot as plt

# α值为函数零点
def p(x):
    return 1 / (1 - x) - 2 / x * math.log(1 / (1 - x))

if __name__ == '__main__':
    x = [0.001 * i for i in range(1, 1000)]
    y = [p(i) for i in x]
    plt.plot(x, y)
    plt.show()

初始图做出来是这样的

基于y轴0点进行放大后,可得到近似结果0.7136

 

实际上也可以对上面的函数写一个简单的二分求解器来求解

epochs = 10000

i = 0

high, low = 0, 1

while i < epochs:
    i += 1
    mid = (high + low) / 2
    mid_v = p(mid)
    if mid_v > 0:
        high = mid
    elif mid_v < 0:
        low = mid
    else:
        break

print(mid, mid_v)    # 0.7153318629591615 0.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值