【问题标题】:About Big O Notation (N*N?)关于大 O 表示法 (N*N?)
【发布时间】:2014-06-05 13:30:40
【问题描述】:

我有一些问题正在努力寻找大 O 来解决。让我困惑的是 (N*N) 个问题:

for (i=1, sum=0, i <= N; i++) {
  for (j=1; j <= N*N; j++) {
     sum++;
  }
}

我猜它是 O(N^3),因为 (N*N) 可能代表两个循环。

for (i=1, sum=0, i <= N; i++) {
  for (j=1; j <= N*N; j++) {
     for (k=1; k<=j; k++) {
       sum++;
     }
  }
}

如果是这样,那么这个将是 O(N^4)?

【问题讨论】:

  • N*N n^2。这是一个非常基本的参考:rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation
  • 在第二个例子的最里面的循环中,它使用了k的限制,这是j的函数,所以我想说答案可能更接近O(N^3*log(N))跨度>
  • @TrippKinetics 1+2+3+...+n = O(n²),所以我怀疑那里有 log
  • 是的,但请看第二个示例的最内层循环。它不使用1, 2, 3... n。它使用1, 2, 3... j j1, 2, 3... n^3
  • Duke 是对的,记住 Big-Oh 是上限。方程的上限为 N^5(内环 = N^2,中环 = N^2 外环 = N。)特里普,记住循环第一次运行时是 1,然后是 2,然后是 3。一路高达 2N。

标签: math big-o computer-science


【解决方案1】:
for (i=1, sum=0, i <= N; i++) {  // loop over i
  for (j=1; j <= N*N; j++) {     // loop over j, no dependency
     sum++;
  }
}

j 上的内部循环独立于i,具有复杂性O(N*N)。 外部循环执行N 次,因此总共O(N^3)

for (i=1, sum=0, i <= N; i++) {  // loop over i
  for (j=1; j <= N*N; j++) {     // loop over j, no dependency
     for (k=1; k<=j; k++) {      // loop over k, dependent on j
       sum++;
     }
  }
}

k 上的循环依赖于jj 在整数上独立循环,直到 N*N。 总和1 + 2 + ... + N * N 等于(N * N + 1) * N * N / 2,即O(N^4)。 现在,i 上的循环又重复了 N 次,因此总复杂度为 O(N^5)

为了计算大O,总是从最里面的循环开始,注意依赖关系!

【讨论】:

  • 您的平方和公式似乎是错误的。 AFAIK 公式是(n * (n + 1) * (2 * n + 1)) / 6,它的顺序是n^3
  • @IvayloStrandjev 不,这不是平方和,而是整数的总和,直到 N 的平方。巨大的差异。
  • @IvayloStrandjev 实际上,在写下我的答案之前我犯了同样的错误;-)
【解决方案2】:

您可以使用 Sigma 表示法有条不紊地正式进行:

【讨论】:

    【解决方案3】:

    我认为是 O(N^5)。

    第一个(外部)循环是 O(N)。

    第二个是O(N^2)。

    最后一个也是O(N^2)。

    【讨论】:

    • 最后一个依赖于第二个,所以我不会说单独提到它的运行时间是完全正确的。
    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 2022-01-13
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多