Java 计算这些算法的大O复杂度?

Java 计算这些算法的大O复杂度?,java,algorithm,structure,complexity-theory,Java,Algorithm,Structure,Complexity Theory,我试图找出下面两种算法的大O符号,但遇到了麻烦 第一个是: public static int fragment3 (int n){ int sum = 0; for (int i = 1; i <= n*n; i *= 4) for (int j = 0; j < i*i; j++) sum++; return sum; } //end fragment 3 当我尝试它时,我得到:n^3用于外部for循环。对于if语句,我得到n,对于第二个for循环,我得到n+另一

我试图找出下面两种算法的大O符号,但遇到了麻烦

第一个是:

public static int fragment3 (int n){
int sum = 0;
for (int i = 1; i <= n*n; i *= 4)
  for (int j = 0; j < i*i; j++)
   sum++;
  return sum;
} //end fragment 3
当我尝试它时,我得到:
n^3
用于外部for循环。对于if语句,我得到
n
,对于第二个for循环,我得到
n+
另一个for循环和if语句,使其成为
n^5
。最后,对于最终的for循环,我得到了n,所有结果加起来都是O(n^6)

我做错了什么?获得复杂性的正确方法是什么?

第一种情况:

  • 最后一次运行i=n^2的内部循环,运行n^4。外环最大可达n^2,但采用指数增长。对于求和,所有内部循环运行的总和,但最后一次小于最后一次运行。所以内环本质上是对O(1)的贡献
第二种情况:

  • 100%n==0在O思维中并不重要
  • 其他部分不重要,它比主要部分小得多
  • 外部循环从0运行到n^3=>n^3
  • 内部循环从0运行到n^6=>n^6
  • 外循环乘以内循环=>n^9
第一种情况:

  • 最后一次运行i=n^2的内部循环,运行n^4。外环最大可达n^2,但采用指数增长。对于求和,所有内部循环运行的总和,但最后一次小于最后一次运行。所以内环本质上是对O(1)的贡献
第二种情况:

  • 100%n==0在O思维中并不重要
  • 其他部分不重要,它比主要部分小得多
  • 外部循环从0运行到n^3=>n^3
  • 内部循环从0运行到n^6=>n^6
  • 外循环乘以内循环=>n^9

您计算big-O的方法是完全错误的,您已经犯了计算错误

在一些常见情况下,您可以采用最坏情况下的迭代次数并将它们相乘,但这不是一种合理的方法,在以下情况下会失败:

for (i = 1; i < n; i *= 2) {
   for (j = 0; j < i; j++) {
      sum++;
   }
}
其中,2^k是小于n的两个的最大幂。该和为2^(k+1)-1,小于2n。因此,精确的复杂度为O(n)

将此想法应用于您的第一个示例:

for (int i = 1; i <= n*n; i *= 4)
    for (int j = 0; j < i*i; j++)
        sum++

现在根据
k
的定义,我们有
n^2/4<4^k你计算大O的方法是完全错误的,而且你已经犯了计算错误

在一些常见情况下,您可以采用最坏情况下的迭代次数并将它们相乘,但这不是一种合理的方法,在以下情况下会失败:

for (i = 1; i < n; i *= 2) {
   for (j = 0; j < i; j++) {
      sum++;
   }
}
其中,2^k是小于n的两个的最大幂。该和为2^(k+1)-1,小于2n。因此,精确的复杂度为O(n)

将此想法应用于您的第一个示例:

for (int i = 1; i <= n*n; i *= 4)
    for (int j = 0; j < i*i; j++)
        sum++
现在根据
k
的定义,我们有
n^2/4<4^k作为第一个

让我们看看内部循环

在外循环(i=1)的第一次迭代中,它运行1次。在第二次迭代(i=4)中,它运行16(4*4)次。在第三次迭代(i=16)时,它运行256(16*16)次。通常,在外循环的第(k+1)次迭代中,内循环运行时间与该次迭代相同。因此,迭代的总数将是

现在,我们总共有多少个数字?为了确定我们应该看一下外环。我在其中成长,直到它到达。所以迭代的总数是

这意味着内部循环的运行总数为

(删除总和中除最后一个之外的所有数字)

现在我们知道,内部循环至少运行了几次,所以我们的速度不超过O(n^4)

现在,

求N

其中C是一个常数,所以我们不比O(n^4)慢。

对于第一个

让我们看看内部循环

在外循环(i=1)的第一次迭代中,它运行1次。在第二次迭代(i=4)中,它运行16(4*4)次。在第三次迭代(i=16)时,它运行256(16*16)次。通常,在外循环的第(k+1)次迭代中,内循环运行时间与该次迭代相同。因此,迭代的总数将是

现在,我们总共有多少个数字?为了确定我们应该看一下外环。我在其中成长,直到它到达。所以迭代的总数是

这意味着内部循环的运行总数为

(删除总和中除最后一个之外的所有数字)

现在我们知道,内部循环至少运行了几次,所以我们的速度不超过O(n^4)

现在,

求N

其中C是常数,所以我们不比O(n^4)慢

(4^0)^2 + (4^1)^2 + ... + (4^k)^2
= 2^0 + 4^2 + ... + 4^2k
= 16^0 + 16^1 + ... + 16^k
= (16^k - 1) / 15