下面的代码片段的算法复杂性

时间:2013-11-19 09:39:32

标签: c++ algorithm time-complexity

我们都知道像

这样的代码片段
for(int i=0;i<n;i++){ //do something}

具有O(n)的复杂性,我们可以找到它:

和符号从n = 0到n-1 c1 = c1 *((n-1)* n)/ 2

如果代码如下:

for(int i=0;i<n;i+=2){ //do something}

我不仅对大写符号感兴趣,而且对确切的增长率函数感兴趣。

有人帮我吗?提前谢谢

3 个答案:

答案 0 :(得分:3)

//do something将被执行n / 2次。

Hence complexity = O(n/2) = O(n) (same as the previous loop)

显然,第二个循环将花费更少的时间,因为它只执行一半的语句。然而,随着n的增长,两个循环的时间复杂度增长应线性

答案 1 :(得分:2)

for(int i=0;i<n;i++) { /* do something */ }

我们不了解/* do something */的复杂性。如果循环的主体没有基于n的内循环。它具有复杂性 O(n)

for(int i=0;i<n;i+=2) { /* do something */ }

与上述相同,这也具有复杂性 O(n)。请注意, O(n / 2)= O(n)

答案 2 :(得分:1)

当你采用Big O表示法时,我们假设n是一个正数集。

N可以以两种方式增长 1-线性 2-指数

如果我们将n乘以> 1的整数,则

N呈指数增长。考虑代码段

for(i=1;i<n;i=i*2){

}

这里增加了一个很大的值,即2,4,8,16,32 ......

如果我们将n增加一个整数&gt; 0(你给出的代码线性增长),N会线性增长

对于线性增长,时间复杂度为O(n)

对于指数增长,时间复杂度为O(logn)

让我们考虑另一个例子

for(i=0;i<n*10;i++){//has Complexity O(n)

}

for(i=0;i<n*n;i++){//has Complexity O(n*n) 

}

这是因为10是常数而n不是常数