考虑一个装载因子为α的开放寻址散列表。找出一个非零的α值,使得一次不成功查找的探查期望数是一次成功查找的探查期望数的2倍。这两个探查期望可以使用定理11.6和定理11.8中给定的上界。
首先是参考了CLRS答案里Lambert W函数的解法,主要是补充一下细节部分
依题意对 进行求解
首先进行替换 ,即 ,原方程化简得到:
两边同时乘 ,再除以,得到:,即:
此时已经满足Lambert W函数的求解形式了(),因此:
,于是
这里可以看出有一个解是 x = 0,但需要的不是这个而是
借助网站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