public static void Comp(int n)
{
int count=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=1;k<n;k*=2)
{
count++;
}
}
}
System.out.println(count);
}
有谁知道时间的复杂性是什么?
什么是Big Oh()
请你能一步一步地向我解释一下吗?
答案 0 :(得分:2)
时间复杂度为O(n^2 log n)
。为什么?每个for循环都是n
的函数。并且你必须为每个for循环乘以n;除了以log n增长的内部循环。为什么?对于每次迭代,k乘以2.考虑合并排序或二叉搜索树。
<强>详情
对于前两个循环:从0到n的1的总和,即n + 1,因此前两个循环给出(n+1)*(n+1)= n^2+2n+1= O(n^2)
k=log n
再次,不清楚?
因此,如果我们设置m=0
和a=2
,那么我们得到-2^n/-1
为什么a = 2?因为这是该系列产生2,4,8,16,... 2 ^ k
答案 1 :(得分:1)
理论上这是O(n^2 * log(n))
。
两个外部循环中的每一个都是O(n)
而内部循环是O(log(n))
,因为log base 2
n
是你必须分割n
的次数通过2
获取1
。
这也是一个严格的约束,即代码也是Θ(n^2 * log(n))
答案 2 :(得分:0)
由于其他人解释的原因,无论谁给你这个问题几乎肯定都在寻找答案n^2 log(n)
。
但问题确实没有任何意义。如果n > 2^30
,k
将溢出,使内循环无限。
即使我们将此问题视为完全理论化的,并假设n
,k
和count
不是Java int
,而是一些理论整数类型,答案n^2 log n
假定操作++
和*=
具有恒定的时间复杂度,无论表示整数需要多少位。这个假设并不是真的有效。
修改强>
我在下面的评论中已经指出,根据硬件的工作方式, 可以合理地假设++
,*=2
和{ {1}}无论需要多少位,都具有恒定的时间复杂度。这使我的答案的第3段无效,但请不要低估我的答案 - 我现在已经被接受了,我无法将其删除!