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循环是否会显着影响其运行时间。
答案 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 <= n
或i
〜
因此,第二部分的复杂度为 O()
所以程序的复杂度是: T(n):O(n)+ O()= O(n)
总体复杂度为 O(n)