该代码的时间复杂度是多少?是O(logn)还是O(loglogn)?

时间:2020-07-31 11:52:34

标签: c++ loops for-loop time-complexity big-o

/user/1->n

这是来自Abdul Bari Youtube频道(link of the video)的代码,他们说时间复杂度是O(loglogn),但我认为它是O(log),正确的答案是什么?

3 个答案:

答案 0 :(得分:3)

修复初始值。 0乘以2将永远不会结束循环。

最后一个循环是O(log log N),因为p == log(n)。但是,第一个循环是O(log N),因此总的来说也是O(log N)

另一方面,一旦您在//code处放置了一些代码,则与第二个循环相比,第一个循环可以忽略不计,并且我们有:

O ( log N   +  X * log log N)
     ^ first loop
               ^ second loop

并且当X足够大时,人们可以将其总计视为O( log log N)。但是严格来讲,这是错误的,因为复杂度是关于渐近行为的,并且无论X有多大,对于N到无穷大,log N总是比X * log log N大。一点。

PS:我假设//code不依赖于N,即它具有恒定的复杂性。如果不是这种情况,上述考虑会发生变化。

PPS:通常,在设计算法时,复杂性很重要。使用算法时,它是无关紧要的。在那种情况下,您宁愿关心N的特定值的实际运行时间。对于给定的N,复杂性可能会引起误解,甚至导致对特定用例的错误期望。

答案 1 :(得分:1)

时间复杂度

listBrands

是O(log(n)),因为您执行p ++ log2(n)次。对数基数以大O表示法无关紧要,因为它只是按常数缩放。

int n;
int p = 0;
for (int i = 1; i < n; i *= 2) { // start at 1, not at 0
    p++;
}

具有O(log(log(n)),因为您只乘以最多得出p = log(n),所以您有O(log(p)),所以O(log(log(n))

但是,两者都仍然是O(log(n)),因为O(log(n)+ log(log(n)))= O(log(n)

答案 2 :(得分:1)

您是正确的,完整代码的时间复杂度为O(log(n))。

但是,阿卜杜勒·巴里爵士先生也是正确的,因为:-

在视频中,Abdul Sir试图找到第二个for loop的时间复杂度,而不是整个代码的时间复杂度。再看一遍视频,然后正确听他此时https://youtu.be/9SgLBjXqwd4?t=568

的讲话

他再次得出的结论是第二个循环的时间复杂度,而不是完整代码的时间复杂度。请听9分28秒时他说的话。

如果您的困惑很清楚,请标记为正确。

相关问题