Java 这个算法的时间复杂度是多少? 公共静态无效组件(int n) { 整数计数=0; for(int i=0;i

Java 这个算法的时间复杂度是多少? 公共静态无效组件(int n) { 整数计数=0; for(int i=0;i,java,algorithm,time,complexity-theory,Java,Algorithm,Time,Complexity Theory,的时间复杂度是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=logn 再说一遍,不清楚 因此,如果我们设置m=0,并且a=2,那么我们得到-2^

的时间复杂度是
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=logn

再说一遍,不清楚

因此,如果我们设置
m=0
,并且
a=2
,那么我们得到
-2^n/-1
为什么a=2?因为这是一个值,序列产生2,4,8,16,…2^k

,理论上这是
O(n^2*log(n))

两个外部循环中的每一个都是
O(n)
,内部循环是
O(log(n))
,因为
log base 2
of
n
是您必须将
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
假设操作
+
*=/code>具有恒定的时间复杂度,不管有多少位表示整数所需的。此假设实际上无效

使现代化
在下面的评论中,有人向我指出,根据硬件的工作方式,可以合理地假设
++
*=2
我认为这是N^2*logN。不正确的是,最内部的for循环取log(N),使最终产品为O(N^2 log(N))他可能想要一个人能给的最紧的束缚,而这一个不是。@G.Bach我几乎不相信最内环是O(N)这通常是一个假设,这是不正确的。2的乘法在硬件上只是一个移位运算,
++
只是一个计数器,它是一个恒定的时钟周期。特别是看看计数器的文章/电路。所以这个问题并不像你想象的那么理论化。在硬件上,这些假设是正确的他的答案显示出OP是多么的迷茫和困惑。这个问题并不像这个人假设的那样理论化,他只是提到其他答案是正确的。那么这是正确的答案吗?想一想,朋友。想一想。@KonsolLabapen的移位操作(即乘以2),并行访问移位寄存器可以工作吗?我去了网站,搜索单词
shift
,就是这样出现的。你需要一个比4位大得多的,但是是的。它应该可以用于移位和任何大型计数器的计数。这当然是一个有趣的讨论。如果你看看门的工作方式(我所说的门是指集成电路):门彼此不知道。移位寄存器中没有级联传播。每个门查看其输入。当时钟周期到来时,每个门根据其输入信号进行计算。因此,可以有十亿个门。如果它们并行排列,它们将在时钟上同时计算。所以是
O(1)
实际上是正确的。这些移位寄存器可以在当地的硬件商店购买,所以没有什么特别的。
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);
}