我们都知道像
这样的代码片段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}
我不仅对大写符号感兴趣,而且对确切的增长率函数感兴趣。
有人帮我吗?提前谢谢
答案 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不是常数