因此,我正在寻找有关c ++代码段的时间复杂度是什么的确认:
for(int i = 0; i<N, i++){
for(int k = 1; k<N; k*=2){
//code with O(1)
}
}
我认为这将是O(NlgN)
,其中lg是对数基数2。
内部循环将是O(lgN)
,因为k在每次迭代后都会加倍。外循环显然是O(N)
,使整个代码:
O(N)*O(lgN) = O(NlgN).
答案 0 :(得分:3)
是的,它以O(n log n)表示,但是基数以大O表示法无关紧要,因为public class MenuItem
{
public int Quantity { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }
}
即
请注意,末尾的对数应该仍然是ln,但是人们并不关心混乱,只要对数以10或e为底,因为在大O中这无关紧要。
因此,即使使用大O表示法,f=n \cdot log_2(n)
\in \mathcal{O}(log_2(n) * n ) \subseteq \mathcal{O}(\frac{ln(n)}{ln(2)} * n ) \subseteq \mathcal{O}(log(n) * n ) \ni f = n \cdot ln (n)
的复杂度也相同。但是,有时候人们在比较非常小的优化时会写下一些恒定因素,但这是不可行的,除非您谈论的是quick sort implementation that runs on billions of instances around the world.
对于这一部分,我们如何确定您的内部循环受for(int k = 2; k<N; k*= k)
约束,我也没有找到一个很好的数学证明。当然执行它是一种证明,但是我的理论方法是,我们可以同意内部循环的执行频率与您的函数log(n)
需要更大的参数才能到达k *= 2
一样,因此{{ 1}},而我们知道要获得所需的n
所需的k(x) >= n
是反函数x
,而k(x)
的反函数是k^(-1)
。