什么是时间复杂度?

时间:2014-05-13 05:18:49

标签: algorithm big-o time-complexity runtime-compilation

以下功能的时间复杂度是多少?

    for(int i = 0; i < a.size; i++) {
        for(int j = i; j < a.size; i++) {
            //
        }
    }

我认为它不是大O n ^ 2因为我们没有迭代第二个for循环中的所有元素。我相信时间的复杂性是这样的:

n[ (n) + (n-1) + (n-2) + ... + (n-n) ]

但是当我解决这个公式时,它就出现了

n^2 - n + n^2 - 2n + n^2 - 3n + ... + n^2 - n^2

这根本不正确。有人可以告诉我如何解决这个问题,以及我错在哪里。

3 个答案:

答案 0 :(得分:5)

那是O(n^2)。如果您认为迭代位于i = a.size() - 1,并且您向后工作(i = a.size() - 2i = a.size - 3等),那么您正在查看以下迭代次数的总和,其中{{1 }}

n = a.size

此系列的总和为1 + 2 + 3 + 4 + ... + n ,即n(n+1)/2。请注意,big-O表示法忽略常量,并在应用于多项式函数时获取最高的多项式幂。

答案 1 :(得分:2)

它将运行:

1 + 2 + 3 + .. + n

哪个1/2 n(n+1)给我们O(n^2)

Big-O符号只会保留主导词,也会忽略常量

当且仅当主导词不同时,Big-O仅用于比较使用相同复杂性分析标准的相同问题变体的算法。

如果主导词是相同的,则需要比较Big-Theta或时间复杂度,这将显示出微小的差异。

enter image description here

示例

A

    for i = 1 .. n
      for j = i .. n
        ..

    for i = 1 .. n
      for j = 1 .. n
        ..

我们有

Time(A) = 1/2 n(n+1) ~ O(n^2)

Time(B) = n^2 ~ O(n^2)

O(A) = O(B)

T(A) < T(B)

<强>分析

想象我们如何得到1 + 2 + 3 + .. n

    for i = 1 .. n:
      print "(1 + "
      sum = 0
      for j = i .. n:
        sum++
      print sum") + "

将打印以下内容:

(1+n) + (1+(n-1)) + .. + (1+3) + (1+2) + (1+1) + (1+0)

n+1 + n + n-1 + .. + 3 + 2 + 1

1 + 2 + 3 + .. + n + n+1

1/2 n(n+1) + (n+1)

1/2 n^2 + 1/2 n + n + 1

1/2 n^2 + 3/2 n + 1

答案 2 :(得分:1)

是的,迭代次数严格小于n^2,但它仍然是Θ(n^2)。对于任何n^k,它最终都会大于k<2,对于任何n^k,它最终都会小于k>2

(作为旁注,计算机科学家经常说big-O,当他们真正意味着大-theta(Θ)。从技术上讲,几乎所有你看过的算法都有O(n!)运行时间在技术上是正确的;所有合理的算法运行时间不会比 n!快得多。但如果它的也是那么复杂度为O(n!)并不是真的有用。 O(n log n),所以通过某种Gricean格言,我们假设有人说算法的复杂性是O(f(x)) f(x)尽可能小。)