我如何找到大的O符号

时间:2018-10-04 23:01:35

标签: algorithm

int something = 0 ;
int t = n ;

while ( t > 1 ) {
   for (int i=0 ; i < t ; i++) {
      something++ ;
   }
   t = t / 2 ;
} 
//number 2
int sum = 0; 
int i = 1; 

while (sum <= n) { 
    sum = sum + i; 
    i++; 
} 

如何找到大O表示法的最紧密上限。我认为它们都将是log n,但是我不确定代码的第一段中的for循环是否会显着影响其运行时间。

1 个答案:

答案 0 :(得分:0)

以上代码的复杂度为 O(n)

让我们计算程序的 第一部分 的复杂度。

int t = n;
while ( t > 1 ) {
   for (int i=0 ; i < t ; i++) {
      something++ ;
   }
   t = t / 2 ;
} 

这将执行:t + t/2 + t/4 + ... + 1 该系列的总和为2t - 1。 (请参阅this)。

因此,第一部分的时间复杂度为O(2t - 1) = O(t) O(n)

对于 第二部分

int sum = 0; 
int i = 1; 
while (sum <= n) { 
    sum = sum + i; 
    i++; 
} 

总和将为1+2+3+....i,即i*(i+1)/2

所以sum =i*(i+1)/2 i 2

sum <= n

所以i 2 <= nid

因此,第二部分的复杂度为 O(d

所以程序的复杂度是: T(n):O(n)+ O(d)= O(n)

总体复杂度为 O(n)