[英]What is the time complexity for this algorithm?
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);
}
有谁知道时间的复杂度是多少?
什么是大Oh()
请您逐步向我解释一下吗?
时间复杂度为O(n^2 log n)
。 为什么? 每个for循环都是n
的函数。 对于每个for循环,您都必须乘以n; 除了作为log n增长的内部循环。 为什么? 对于每次迭代,k都将乘以2。考虑合并排序或二叉搜索树。
细节
对于前两个循环:1从0到n的和,即n + 1,因此前两个循环给出(n+1)*(n+1)= n^2+2n+1= O(n^2)
对于k循环,我们有k增长为1,2,4,8,16,32,...,因此2 ^ k = n。 取双方的对数,您将得到k=log n
同样,不清楚吗?
因此,如果我们将m=0
设置m=0
a=2
那么我们得到-2^n/-1
为什么a = 2? 因为那是一个值,该序列可得出2,4,8,16,... 2 ^ k
理论上,这是O(n^2 * log(n))
。
两个外部循环中的每个循环均为O(n)
,内部两个循环为O(n)
O(log(n))
,因为n
的对数以log base 2
为log base 2
是您必须将n
除以2
才能得到1
。
这也是一个严格的界限,即代码也是Θ(n^2 * log(n))
谁给您这个问题,几乎可以肯定是在寻找答案n^2 log(n)
,这是由其他人解释的原因。
但是,这个问题实际上没有任何意义。 如果n > 2^30
,则k
将溢出,从而使内部循环变为无限。
即使我们将这个问题完全视为理论问题,并假设n
, k
和count
不是Java int
s,而是某种理论上的整数类型,答案n^2 log n
假定++
和*=
操作具有恒定时间复杂度,无论需要多少位来表示整数。 这个假设不是真的成立。
有人向我指出在下面的意见,基于硬件的工作方式,这是合理的假设, ++
, *=2
和<
都有固定的时间复杂度,无论需要多少位。 这使我的答案的第三段无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.