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

时间:2015-04-07 16:15:48

标签: java algorithm time complexity-theory

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()

请你能一步一步地向我解释一下吗?

3 个答案:

答案 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循环,我们将k增长为1,2,4,8,16,32,...因此2 ^ k = n。记录双方的日志,得到k=log n

再次,不清楚?

enter image description here

因此,如果我们设置m=0a=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^30k将溢出,使内循环无限。

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

修改

我在下面的评论中已经指出,根据硬件的工作方式, 可以合理地假设++*=2和{ {1}}无论需要多少位,都具有恒定的时间复杂度。这使我的答案的第3段无效,但请不要低估我的答案 - 我现在已经被接受了,我无法将其删除!