习题:复杂度分析(上)

说明

习题都是本人收集而来,也是为了方便以后复习

持续更新中...

试分析下面各程序段的时间复杂度

1.
x = 90;y = 100;
while(y > 0){
    if(x > 100){
        x = x -10;
        y--;
    }else{
        x++;
    }
}

解答:由于此程序段中并没有和数据规模n相关,数据规模为常量,所以

O(1)
2.
for(i = 0; i < n; i++){
    for(j = 0; j < m; j++){
        a[i][j] = 0;
    }
}

解答:由程序段可以看出,第三行的数据规模是最大的,第一行时间复杂度为n,第二行时间复杂度为m,根据乘法法则得出第三行时间复杂度为

O(m*n)
3.
s = 0;
for(i = 0; i < n; i++){
    for(j = 0; j < n; j++){
        s += B[i][j];
    }
    sum = s;
}

解答:由程序段可以看出,第四行代码的数据规模最大,第二行时间复杂度是n,第三行也是n,同样适用乘法法则得出时间复杂度为

O(n^2)
4.
i = 1;
while(i <= n){
    i = i*3;
}

解答:由程序段可以看出,第三行数据规模最大,且当i>n时才会跳出循环,每次循环相当于i*3,共进行了n次循环,此为等比数列,得出

O(log3^n)
5.
x = 0;
for(i = 1; i < n; i++){
    for(j = 1; j <= n-i; j++){
        x++;
    }
}

解答:此程序段只有第四行代码的数据规模最大,要想进行第四行必须满足1<=n-i,所以实际上共执行了n-1+n-2+...+1 = (n-1)(n-1+1)/2,所以时间复杂度为

O(n^2)
6.
x = n; //n > 1
y = 0;
while(x => (y+1)*(y+1)){
    y++;
}

解答:此程序段第四行代码数据规模最大,当n>=(y+1)(y+1)时候都会进入第四行,则时间复杂度

\sqrt{n} //根号n

下一篇:数据结构与算法之美——复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

你可能感兴趣的:(习题:复杂度分析(上))