def findMax(f,c):
n=1
while f(n) <= c:
n += 1
return n
这是一个更高阶的python函数,给出函数f和最大计数,
c,返回最大的n,使得f(n)≤c。这可行,但是当n变得太大而无法例如f(10**6)
时。如何使此算法运行O(log n)时间,以便使用下面的函数来促进f(10**6)
?
def f(n):
return math.log(n, 2)
答案 0 :(得分:0)
将n += 1
更改为n *= 2
以获得对数结果。
对数序列以2 的倍数递增 ,并且非线性,因此对数序列不会递增1。
答案 1 :(得分:0)
使用搜索算法更快地找到解决方案。这是使用jpe.math.framework.algorythems.brent的实现,这是brent搜索算法的实现。
import math
import jpe
import jpe.math.framework.algorythems
def f(x):
return math.log(x, 2)
value = 9E2
startVal = 1E300
val = int(jpe.math.framework.algorythems.brent(f, a=0, b=startVal, val=value, mode=jpe.math.framework.algorythems.modes.equalVal)[0])#takes 37 iters
print(val)
在这种情况下,也可以使用以下f:
结果在2 ** c的1个以内(传递给findMax的c)