Time complexity 嵌套循环的大O(int j=0;j<;i*i;+;+;j)

Time complexity 嵌套循环的大O(int j=0;j<;i*i;+;+;j),time-complexity,big-o,Time Complexity,Big O,问题1 for (i = 0; i < n; i++) { for (j = 0; j < i * i ; j++){ } } Answer: O(n^3) (i=0;i

问题1

for (i = 0; i < n; i++) {
  for (j = 0; j < i * i ; j++){

  }
}
Answer: O(n^3)
(i=0;i{ 对于(j=0;j 乍一看,O(n^3)对我来说是有意义的,但我记得我以前遇到过一个问题:

问题2

for (int i = n; i > 0; i /= 2) {
   for (int j = 0; j < i; j++) {
     //statement
   }
}
Answer: O(n)
for(int i=n;i>0;i/=2){
对于(int j=0;j
对于问题2,外环是O(logn),内环是O(2n/logn),结果是O(n)。内部循环是O(2n/logn),因为-请参见此处的解释:嵌套循环的大O(int j=0;j
为什么我们不像问题2那样做问题1,因为在问题1中,
j
也取决于
i
,这意味着我们应该计算内部循环中迭代次数的平均值(就像我们在问题2中所做的那样)


我的答案是:O(n)表示外环,O(n^2/n)表示内环,这导致问题1的结果是O(n^2)。

你的答案是错误的。代码是
Θ(n³)

要了解这一点,请注意,内部循环需要
步骤,这最多是
,但外部循环迭代的一半至少是
(n/2)²=n²/4

因此,总内部迭代次数最多为
n*n²=n³
,但至少为
n/2*n²/4=n³/8



您的考虑是错误的,因为内部循环平均与
多次迭代成比例,而不是
n²/n

您的答案是错误的。代码是
Θ(n³)

void fun(int n, int k) 
{ 
    for (int i=1; i<=n; i++) 
    { 
      int p = pow(i, k);  
      for (int j=1; j<=p; j++) 
      { 
          // Some O(1) work 
      } 
    } 
} 
要了解这一点,请注意,内部循环需要
步骤,这最多是
,但外部循环迭代的一半至少是
(n/2)²=n²/4

因此,总内部迭代次数最多为
n*n²=n³
,但至少为
n/2*n²/4=n³/8



您的考虑是错误的,因为内部循环平均与
多次迭代成比例,而不是
n²/n
内部
for
循环与外部
for
循环一起计算
i^2
之和。如果您将其写出来,您将添加以下术语:

void fun(int n, int k) 
{ 
    for (int i=1; i<=n; i++) 
    { 
      int p = pow(i, k);  
      for (int j=1; j<=p; j++) 
      { 
          // Some O(1) work 
      } 
    } 
} 
1 + 4 + 9 + 16 + ...
(2n^3+3n^2+n)/6
。如果要计算内部
for
循环的平均迭代次数,可以将其除以
n
,因为这是外部
for
循环的迭代次数。所以你得到了
(2n^2+3n+1)/6
,根据大O符号,这将是
O(n^2)
。拥有它会让你。。。没有什么。您尚未获得任何新信息,因为您已经知道
的内部
循环的复杂性是
O(n^2)
。拥有
O(n^2)
运行
n
的时间会给你
O(n^3)
带来你已经知道的全部复杂性


因此,您可以为
循环计算内部
的平均迭代次数,但不会获得任何新信息。在迭代步骤的数量上没有像你之前的问题中那样减少(
i/=2
的东西)。

你的
for
内部循环与
for
外部循环的作用是计算
i^2
的总和。如果您将其写出来,您将添加以下术语:

1 + 4 + 9 + 16 + ...
(2n^3+3n^2+n)/6
。如果要计算内部
for
循环的平均迭代次数,可以将其除以
n
,因为这是外部
for
循环的迭代次数。所以你得到了
(2n^2+3n+1)/6
,根据大O符号,这将是
O(n^2)
。拥有它会让你。。。没有什么。您尚未获得任何新信息,因为您已经知道
的内部
循环的复杂性是
O(n^2)
。拥有
O(n^2)
运行
n
的时间会给你
O(n^3)
带来你已经知道的全部复杂性


因此,您可以为
循环计算内部
的平均迭代次数,但不会获得任何新信息。迭代步骤的数量没有像你之前的问题中那样减少(i/=2
之类的问题)。

先生,我怎么了==>@snr内部和的计算结果为
i^2
,而不是
i^4
。它只是计算从
0
i^2
的迭代次数。哦,是的,对不起。@csguy如果你想,你可以使用平均值。这是正确的做法。你只是用错误的方法计算了平均数。因为我不知道你是怎么得到它的,你可能想解释一下,这样我才能纠正它。困难的部分实际上是计算平均数。一种通常有效的方法是通过增加运行时间对迭代进行排序,并查看最大值(此处为
n^2
)和有限部分情况下的值,例如,此处为一半情况下的
(n/2)²
。这样你就知道(直到一个常数因子)平均值在这两个值之间。@csguy,只有当分子中的数字是内环的总迭代次数时,这才有效,即
。但总迭代次数正是我们首先要搜索的。所以这有点绕圈子了。是的,以这种方式形成平均值,然后将其与外部循环中的迭代次数相乘,对于Q2也是毫无意义的。如果你用这种方法计算平均数,那么你已经预先计算了问题本身的实际答案,作为平均数的分子。困难的部分是找出为什么在第二季度它是
2n
。先生,我怎么了==>@snr内部和的计算结果为
i^2
,而不是
i^4
。它只是计算从
0
i^2
的迭代次数。哦,是的,对不起。@csguy如果你想,你可以使用平均值。那是一个c