对于下面的代码段,估算了大写符号的时间复杂度。
for (int i=0; i< n; i++)
for (int j=0; j*j <n;j++)
for (int k=0; k < n/2;k++)
System.out.println (i+j+k);
我认为它们是嵌套循环,但我不是100%肯定。从我可以看出,第一个循环的最差时间是O(n),第二个是O(sqrt(n)),第三个是O(log n)。那是对的吗?我是否只需乘以这些值来获得整个循环的时间复杂度?
答案 0 :(得分:2)
为了扩展Krypton的评论,循环如下:
乘法,循环1和3一起是O(n ^ 2),并且三者一起是O(n ^(5/2))或O(n ^(2.5))。这是在二次和多项式时间之间的一些奇怪的灰色区域。
答案 1 :(得分:2)
for (int i=0; i< n; i++) ------------------------------------
|
for (int j=0; j*j <n;j++) ---------------------- |
| | O(n)
for (int k=0; k < n/2;k++) ------- | |
|O(n/2) |O(n^1/2) |
System.out.println (i+j+k); --- | |
| |
---------------------- |
|
------------------------------------
因此运行时
O(n)*O(n^1/2)*O(n/2) = O(n^(5/2))
答案 2 :(得分:1)
我认为O(n *(n ^(1/2))*(n / 2))。但我不确定。
答案 3 :(得分:0)
for (int i=0; i< n; i++) { // O(n)
for (int j=0; j*j <n;j++) { // O(n^0.5)
for (int k=0; k < n/2;k++) { // O(0.5*n)
System.out.println (i+j+k); // O(1)
}}}
添加相同的范围语句,嵌套语句相乘
O((n)*(n^0.5)*(0.5*n)*(1))
= O(0.5*(n^2)*(n^0.5))
= O(0.5n^2.5)
= O(n^2.5)
答案 4 :(得分:0)
环1的变化率线性地取决于n - >; O(n) - 线性
循环2的变化率取决于n - >的平方根。 O(n ^ 0.5) - 分数幂
环3的变化率线性地取决于n / 2,但是可以去除1/2常数 - &gt; O(n / 2) - 线性
因此,总体复杂度为O(n)* O(n ^ 0.5)* O(n)= O(n ^ 2.5)
检查以获取更多信息:http://www.brpreiss.com/books/opus5/html/page72.html