我有兴趣确定以下内容的大 O 时间复杂度:
def f(x):
r = x / 2
d = 1e-10
while abs(x - r**2) > d:
r = (r + x/r) / 2
return r
我相信这是 O(log n)。为了达到这个目的,我只是通过timeit模块收集了经验数据并绘制了结果,并使用以下代码看到了看起来对数的图:
ns = np.linspace(1, 50_000, 100, dtype=int)
ts = [timeit.timeit('f({})'.format(n),
number=100,
globals=globals())
for n in ns]
plt.plot(ns, ts, 'or')
但这似乎是解决这个问题的一种老套方法。直觉上,我知道 while 循环的主体涉及将一个表达式除以 2 k 次,直到 while 表达式等于 d。重复除以 2 得到类似 1/2^k 的结果,从中我可以看到在哪里涉及对数来求解 k。不过,我似乎无法写下更明确的推导。有什么帮助吗?
元芳怎么了
阿波罗的战车
眼眸繁星
随时随地看视频慕课网APP
相关分类