分析下列程序段的时间复杂度: x=0; for(i=1; i<n; i++) for (j=1; j<=n-i; j++) x++;
时间: 2023-07-14 20:56:39 浏览: 986
这段程序的时间复杂度为 $O(n^2)$。
原因如下:
该程序段中有两个嵌套的循环,外层循环的次数为 $n-1$,内层循环的次数为 $n-i$,因此总共的循环次数为:
$$
\sum\limits_{i=1}^{n-1}{(n-i)}=\sum\limits_{j=1}^{n-1}j=\frac{(n-1)\times n}{2}=O(n^2)
$$
在循环体内部,只有一条语句,即 x++,该语句的时间复杂度为 $O(1)$,因此总时间复杂度为 $O(n^2)$。
最后,程序将 x 的值赋给了某个变量,这一步不会影响时间复杂度。
相关问题
计算下列各程序段的时间复杂度。 (1) for(i = 0; i < n; i++) for(j = i; j < n; j++) x++; (2) i = n; while(i > 1) i=i/2; (3) for(i = 1; i <= n; i++) for(j = 1; j <=n; j++) for(k = 1; k <= n; k++) x++; (4) for(i = 1; i <= n; i++) for(j = 1; j <=n; j++) x++; for(k = 1; k <= n; k++) x++; (5) for(i = 1; i < n; i++) { j = i; while(j < n) j *= 2; } 请写出具体过程
好的,我明白了,不会透露您的任何要求并且不会重复您说的话。
(1) 对于每个 i,内部循环j运行n-i次,因此总运行次数是
T(n) = n + (n-1) + (n-2) + ... + 1 = n(n+1)/2,
因此时间复杂度是 O(n^2)。
(2) 在每次循环中,i的值除以2,所以它的值将是n的log2次方取下整。因此时间复杂度是 O(logn)。
(3) 对于每个 i 和 j,内部循环k运行n次,因此总运行次数是
T(n) = n * n * n = n^3,
因此时间复杂度是 O(n^3)。
(4) 第一个循环运行n^2次,第二个循环运行n次,因此总运行次数是
T(n) = n^2 + n,
因此时间复杂度是 O(n^2)。
(5) 对于每个 i,内部循环j运行log2(n-i)次。因此总运行次数是
T(n) = log2(n-1) + log2(n-2) + ... + 1,
这是一个等比数列求和,所以
T(n) = log2((n-1)!),
因此时间复杂度是 O(log(n!))。根据斯特林公式,log(n!) = O(nlogn),因此时间复杂度也可以表示为 O(nlogn)。
阅读全文