C代码片段的大O表示法和时间复杂性

时间:2019-02-22 04:30:15

标签: c++ big-o

因此,我正在寻找有关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).

1 个答案:

答案 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; } }

enter image description here

请注意,末尾的对数应该仍然是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)