确定并分析这些不同循环的大O运行时间

时间:2016-09-19 21:27:55

标签: algorithm time-complexity

这里是简单的代码,我想找出代码的时间复杂度 我已经对它进行了分析,我的老师告诉我,它有一个错误。我无法弄清楚我错在哪里。需要帮助。感谢

print(0 / 0)

这里我得到了答案

时间复杂度= O(n / loglogn)。

我只是想知道我哪里错了

2 个答案:

答案 0 :(得分:0)

您从2转到n,每一步都会向累加器添加log log n,因此您确实有n / log log n步。

然而,每步做什么?每一步,您都会从j转到n,每一步都会累加累加器。那是多少次操作? 我不是百分百肯定,但基于一点点而且基于this answer,这似乎最终成为log log (n - j)步,或log log n短。

因此,n / log log n步骤,每步执行log log n次操作,会为您提供O(n / log log n * log log n)O(n)算法。

有些实验似乎或多或少地证明了这一点(Python),尽管n_opsn变得更大时似乎有点标记:

import math

def doit(n):
    n_ops = 0

    j = 2
    while j < n:
        k = j
        while k < n:
            # sum + = a[k]*b[k]
            k = k*k
            n_ops += 1

        k = math.log(n, 2)
        j += math.log(k, 2)
        n_ops += 1

    return n_ops

结果:

>>> doit(100)
76
>>> doit(1000)
614
>>> doit(10000)
5389
>>> doit(100000)
49418
>>> doit(1000000)
463527

答案 1 :(得分:0)

确定。让我们来看看。在

k=j
while(k < n) 
{
    sum + = a[k]*b[k]
    k = k*k
}

位需要 j ^(2 ^ i)到达 n 。即什么 2 ^ i 到达 log_j(n) log_2(log_j(n))。现在你有了

j = 2
while(j<n)
{
    // stuff that takes log_2(log_j(n))
    j += log(log(n))
}

这需要n/log(log(n))个步骤,但这些步骤需要不同的时间。如果他们花了相同的时间,你就是对的。但是你需要总结{j从2到n / log(log(n))} log_2(log_j(n)),这是

sum for {j from 2 to n/log(log(n))} [log_2(log(n)) - log_2(log(j))]

这不是那么简单。好吧,至少,我想我已经指出你可能错了,这就是问题。