Algorithm 时间复杂度差-O(logn)与O(logn)

Algorithm 时间复杂度差-O(logn)与O(logn),algorithm,big-o,logarithm,Algorithm,Big O,Logarithm,我正在回顾如何计算函数的时间复杂度,并努力解释以下原因: 据我所知,O(logn)比O(logn)小,因为: O (log n) | O [ log (log n) ] = O (log 100) | O [ log (log 100) ] = O (2) | O [ log (2) ] = O (2) | O [ 0.3010 ] 但是,我相信下面的代码段可以计算为O(log n): p=0 对于(i=1;i您不能仅仅假设整个算法的时间复杂度为log n。由于您的第一个循环的复杂度为l

我正在回顾如何计算函数的时间复杂度,并努力解释以下原因:

据我所知,O(logn)比O(logn)小,因为:

O (log n) | O [ log (log n) ]

= O (log 100) | O [ log (log 100) ]

= O (2) | O [ log (2) ]

= O (2) | O [ 0.3010 ]
但是,我相信下面的代码段可以计算为O(log n):

p=0

对于(i=1;i您不能仅仅假设整个算法的时间复杂度为log n。由于您的第一个循环的复杂度为log n,您可以正确地说第二个循环的计算时间为log(log n),整个算法的时间复杂度仍然为log(n)尽管如此,这是因为本质上只考虑了最高的时间复杂度


您还应该注意到,大O不关心常数乘数。如果您有一个计算时间为2500 log(n)的算法,它仍然可以被视为log(n)就大O表示法而言。因此,对循环的倍数求和不会改变计算时间复杂度的方式。取
N=1.15792…10^77
。第一个循环将执行
1024次。第二个循环将执行
10次。您可以得出结论



请注意,对于
N
的中等值,
logn
logn
之间的差异其实并不重要!

您将时间复杂度与值的计算混为一谈。循环不是嵌套的,因此您原来的复杂度不正确。您的论点是第二个循环取O(logn)时间(正确),但您错误地将其扩展为整个代码需要O(logn)时间。@PaulHankin啊,我明白了,我们应该对这两个for循环的运行时间进行“求和”?我发现在使用复杂度时,说出我测量的内容很有帮助。例如,“代码执行O(logn)循环迭代。”目前,您的语言非常模糊(抱歉,如果英语不是您的第一语言),例如“代码段可以计算为O(log n)”虽然可以猜测各种解释,但这并不意味着什么。你必须弄清楚你测量的是什么,然后它就更清晰了。如果是语句,那么你必须在它们所在的任何循环中计算语句(所以“总和”是正确的)。
p = 0
for( i=1; i<n; i=i*2 ) { 
    p++ // log n 
} 

for( j=1; j<p; j=j*2 ) { 
    some_statement // log P
}
// P=log n, ∴ O( log log n )