【问题标题】:Big(O) notation - which one is correct大(O)符号 - 哪一个是正确的
【发布时间】:2018-06-14 15:08:57
【问题描述】:

我正在尝试学习 Big(O) 符号。在网上搜索一些文章时,我遇到了两篇不同的文章,AB

严格来说,就循环而言 - 似乎它们几乎具有相同的流。 例如

[A]的代码如下(在JS中完成)

function allPairs(arr) {
    var pairs = [];
    for (var i = 0; i < arr.length; i++) {
        for (var j = i + 1; j < arr.length; j++) {
            pairs.push([arr[i], arr[j]]);
        }
    }

    return pairs;
}

[B] 的代码如下(用 C 完成)- 整个代码是here

  for(int i = 0; i < n-1 ; i++) {
    char min = A[i]; // minimal element seen so far
    int min_pos = i; // memorize its position
    // search for min starting from position i+1
    for(int j = i + 1; j < n; j++) 
      if(A[j] < min) {
        min = A[j];
        min_pos = j;
      }
    // swap elements at positions i and min_pos
    A[min_pos] = A[i];
    A[i] = min;
  } 

站点 A 上的文章提到时间复杂度是 O(n^2),而站点 B 上的文章提到时间复杂度是 O(1/2·n2)。

哪个是对的?

谢谢

【问题讨论】:

    标签: algorithm sorting big-o


    【解决方案1】:

    假设O(1/2·n2)表示O(1/2·n^2),则两者时间复杂度相等。请记住,Big(O) 表示法不关心常量,因此两种算法都是 O(n^2)。

    【讨论】:

    • 是什么让示例 B O(1/2 n^2)?
    • 有两个嵌套循环,这足以说它是O(n^2)。我不在乎那个 1/2 常数的含义,因为正如我之前所说,常数对于 Big-O 表示法并不重要。
    【解决方案2】:

    你没有仔细阅读。文章 B 说该算法执行大约 N²/2 比较,并继续解释这是 O(N²)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多