循环中循环的大 O 表示法是什么

What is the Big O notation of a loop in loop

我有这段代码,但无法理解其中的 Big-O...谢谢

for(i = 0; i<n; i++){
  for(j = i; j<n; j++){
    if (arr[j]%2!=0){
       if (minodd > arr[j]){
       }
    }
  }
}

这不是永远持续下去吗?

你的内循环中有 i < n,所以我认为它是 O(inf)

既然你已经更新了循环,我认为 @e2-e4 是正确的:

#include <stdio.h>

int eqn(int n)
{
    return n > 0 ? n + eqn(n - 1) : 0;
}

int main(int argc, char **argv)
{
    int i, j, n, v, a;

    v = 0;
    n = 5;

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

    // v = 15 ? 15
    printf("v = %d ? %d\n", v, eqn(n));

    return 0;
}

解决此问题的最佳方法之一是将其分解为更小的部分。

首先,让我们看看您的内部循环:

for(j = i; j<n; j++){
    if (arr[j]%2!=0){    // O(1)
       if (minodd > arr[j]){ // O(1)
       }
    }
  }

if 语句是 O(1) 或常数时间,所以我们可以忽略它们,我们只得到内部 for 循环:

for(j = i; j<n; j++){
... // O(1) + O(1)
}

由于最坏的情况是它循环 n 次我们有 O(n) + O(1) + O(1) 可以简化为 O(n) 称为 线性时间.

接下来,让我们缩小并用我们的新信息替换内部循环:

for(i = 0; i<n; i++){
  for(j = i; j<n; j++){
    if (arr[j]%2!=0){
       if (minodd > arr[j]){
       }
    }
  }
}

变成:

for(i = 0; i<n; i++){
    O(n)
}

因为我们知道外部for循环在最坏情况下会循环n次,而内部for循环在最坏情况下会循环n次:我们得到O(n x n)或O(n²) 也称为 多项式时间.