为什么O(n)需要比O(n ^ 2)更长的时间?

时间:2018-05-25 16:53:30

标签: swift algorithm for-loop time-complexity big-o

我有一个LeetCode问题:

给定M×N矩阵,当且仅当矩阵为Toeplitz时返回True。

如果从左上角到右下角的每个对角线都具有相同的元素,则矩阵为Toeplitz

我的解决方案是(斯威夫特):

func isToeplitzMatrix(_ matrix: [[Int]]) -> Bool {
    if matrix.count == 1 { return true }

    for i in 0 ..< matrix.count - 1 {
        if matrix[i].dropLast() != matrix[i + 1].dropFirst() { return false }
    }

    return true
}

正如我理解Big O表示法,我的算法时间复杂度为O(n),而LeetCode最高答案为O(n ^ 2)。

热门答案示例:

func isToeplitzMatrix(_ matrix: [[Int]]) -> Bool {
    for i in 0..<matrix.count-1 {
      for j in 0..<matrix[0].count-1 {
          if (matrix[i][j] != matrix[i+1][j+1]) {
              return false;
          }
      }
    }

     return true;
}

尽管如此,我的算法需要36毫秒(根据LeetCode),而最佳答案需要28毫秒。

当我评论if matrix.count == 1 { return true }时,需要花费更多时间才能运行 - 56毫秒。

1 个答案:

答案 0 :(得分:3)

函数的时间复杂度也是O(n ^ 2),因为函数调用dropLast是O(n)。

编辑: Rup和melpomene也提到过,数组的比较也使复杂度达到O(n ^ 2)。

此外,Big O表示法描述了算法如何根据n(数据的数量)进行缩放。为简洁起见,它会消除任何常数。因此,如果输入数据足够小,则使用O(1)的算法可能比具有O(n ^ 3)的算法慢。