繁体   English   中英

该算法的时间复杂度是多少?

[英]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 2log base 2是您必须将n除以2才能得到1

这也是一个严格的界限,即代码也是Θ(n^2 * log(n))

谁给您这个问题,几乎可以肯定是在寻找答案n^2 log(n) ,这是由其他人解释的原因。

但是,这个问题实际上没有任何意义。 如果n > 2^30 ,则k将溢出,从而使内部循环变为无限。

即使我们将这个问题完全视为理论问题,并假设nkcount不是Java int s,而是某种理论上的整数类型,答案n^2 log n假定++*=操作具有恒定时间复杂度,无论需要多少位来表示整数。 这个假设不是真的成立。

更新资料

有人向我指出在下面的意见,基于硬件的工作方式,这合理的假设, ++*=2<都有固定的时间复杂度,无论需要多少位。 这使我的答案的第三段无效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM