如何让这个python函数运行O(log n)时间而不是O(n)时间?

时间:2017-03-21 18:48:00

标签: python algorithm time-complexity divide-and-conquer

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)

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)