【问题标题】:Big O notation for triangular numbers?三角数的大 O 表示法?
【发布时间】:2010-07-05 12:09:01
【问题描述】:

对于在triangular 时间运行的算法,正确的大 O 表示法是什么?这是一个例子:

func(x):
  for i in 0..x
    for j in 0..i
      do_something(i, j)

我的第一直觉是O(n²),但我并不完全确定。

【问题讨论】:

  • 你是对的... O((n+1) 根据定义选择 2) = O(n^2)。

标签: big-o


【解决方案1】:

是的,N*(N+1)/2,当你去掉常数和低阶项时,你会得到 N 平方。

【讨论】:

    【解决方案2】:

    是的,O(n^2) 绝对正确。如果我没记错的话,O 总是一个上限,所以O(n^3) 应该 IMO 也是正确的,O(n^n) 也应该是正确的。不过O(n^2)似乎是最紧的,很容易扣款。

    【讨论】:

      【解决方案3】:

      此代码的计算时间增加了 N*(N + 1)/2 倍。这基本上是 O(N^2)。

      【讨论】:

        【解决方案4】:

        当输入从 N 增加到 2N 那么你的算法的运行时间将从 t 增加到 4t

        因此运行时间与输入大小的平方成正比

        所以算法是O(n^2)

        【讨论】:

          【解决方案5】:

          如果您从数学角度考虑,您正在计算的三角形面积是((n+1)^2)/2。因此这是计算时间:O(((n+1)^2)/2)

          【讨论】:

          • 你开始得很好:三角形的面积≈正方形的面积所以O(n²)
          【解决方案6】:

          O(!n) 处理阶乘计算(三角时间)的情况。

          它也可以表示为 O(n^2) 对我来说这似乎有点误导,因为正在执行的数量总是将是 O(n^2) 的一半。

          【讨论】:

          • 根据定义,O(0.5 * n^2) == O(n^2)(事实上,任何非零常数因子都成立的等式),所以从严格的理论角度来看,这不会产生误导。 :-)
          • -1。 Factorialtriangular number 不同。
          • 阶乘是product({1…n}),三角形数是sum({1…n}) ≈ n²