习题(复杂度分析(上))

说明
【习题(复杂度分析(上))】习题都是本人收集而来,也是为了方便以后复习
持续更新中...
试分析下面各程序段的时间复杂度
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

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

    推荐阅读