这里是简单的代码,我想找出代码的时间复杂度 我已经对它进行了分析,我的老师告诉我,它有一个错误。我无法弄清楚我错在哪里。需要帮助。感谢
print(0 / 0)
这里我得到了答案
时间复杂度= O(n / loglogn)。
我只是想知道我哪里错了
答案 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_ops
在n
变得更大时似乎有点标记:
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))]
这不是那么简单。好吧,至少,我想我已经指出你可能错了,这就是问题。