/user/1->n
这是来自Abdul Bari Youtube频道(link of the video)的代码,他们说时间复杂度是O(loglogn),但我认为它是O(log),正确的答案是什么?
答案 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秒时他说的话。
如果您的困惑很清楚,请标记为正确。