O(n)+ O(n)= O(n)?

时间:2014-07-07 22:34:03

标签: python algorithm big-o

根据O'Reilly的Python in a Nutshell中的Alex Martelli,复杂性等级O(n) + O(n) = O(n)。所以我相信它。但我很困惑。他解释说,“N的两个线性函数之和也是N的线性函数。”

根据wikipedia,在功能分析中,线性函数是线性映射,其示例为f(x+y) = f(x) + f(y)。发现似乎更简单的定义here简单地说明,“线性函数是一个函数,其图形是一条直线。”它包含了一些比维基百科文章更不深奥的例子。

y = f(x) = a + bx

y = 25 + 5x

let x = 1
then
y = 25 + 5(1) = 30

let x = 3
then
y = 25 + 5(3) = 40

可能期望两个线性方程的和可以在图上表示为直线,这表示类似于表示每个方程的直线之间的平均的东西是公平的。

所以我理解正确,即使在以下两个函数中,“复杂”函数的处理时间是“简单”函数的三倍,它们每个函数都以big-O表示为O(n),因为处理时间的弧线将由图表/图表上的直线对角线表示,时间差异将由图形表示中更复杂函数的角度更锐利的事实表示?< / p>

from timer import Timer

def complex(it):
    result = []
    for i in it:
        result.append(i)
    result.reverse()
    return result

def simple(it):
    result = list(it)

longlist = list(range(0, 1000000))

with Timer() as t:
    reverse_(longlist)
print "=> elapsed time reverse: %s." % t.secs

with Timer() as t:
    straight(longlist)
print "=> elapsed time straight: %s" % t.secs

8 个答案:

答案 0 :(得分:10)

正确,O(n)+ O(n)= O(n)。

更具体地说,O(n)+ O(n)= 2 * O(n),但由于大O只关心函数,因为它们倾向于无穷大,所以任何线性都表示为O(n)。

答案 1 :(得分:10)

该陈述是正确的,因为添加两个线性函数也是线性函数。以这两个为例:

y = 6*x + 10
y = 20*x + 2

将它们组合在一起,你得到:

y = 26*x + 12

这也是线性功能!这适用于任何两个线性函数。

y = A*x + B
y = C*x + D
-----------
y = (A+C)*x + (B+D)

答案 2 :(得分:8)

  

所以即使在以下两个函数中,“复杂”函数的处理时间是“简单”函数的三倍,它们每个函数都以大O符号表示为O(n),因为它的弧形处理时间将由图/图上的直线对角线表示,即使更复杂函数的角度更锐利?

是。使用字母 O 是因为它引用了函数的顺序。线性函数具有相同的顺序O(n)O(3n)O(Cn)都是线性的。

另一方面,O(n^2)O(n^3)O(n^C)都是多项式函数(度数为2,3,C)。在这里(处理算法时),我们经常开始区分O(n^2)O(n^5)之类的东西 - 即使它们都是相同的顺序。

O(2^n)O(3^n)O(C^n)是指数级的。您通常不希望编写具有指数复杂性(或更糟)的算法。

答案 3 :(得分:6)

一个好的(最好的?)方法是回到big-O的数学定义:

enter image description here

用简单的英语:

  

这两个陈述是等价的:

     
      
  • f O(g)

  •   
  • f(n) g(n) 之比 n 增加趋向于非负值。

  •   

在我们的案例中,我们有 g(n)= n 。现在,如果我们让 f(n)= f 1 (n)+ f 2 (n) 并假设 f 1 f 2 < em> O(n),上述限制将等于 α=α 1 2 其本身必须大于或等于零(因为根据定义 α 1 ≥0 α 2 ≥0 )。因此 f 1 (n)+ f 2 (n) O(n)< / em>,根据我们的定义。

答案 4 :(得分:3)

是的,这是因为Big-O表示法不是用于计算绝对运行时间,而是用于描述输入增长的算法的行为。

换句话说,如果你有一些算法适用于O(3n)O(n)而你增加n但是你想要它们都会运行得更长。

它只是给出了一个概念,即一个算法是否会在增加输入的某个点超出另一个算法。

当然,数学上一切都可以用定义证明。

答案 5 :(得分:3)

让我们说第一个O(n)用等式表示:

y1 = f1(x) = a1 + b1.x

,第二个O(n)由等式表示:

y2 = f2(x) = a2 + b2.x

加入双方,

y1 + y2 = f1(x) + f2(x) = (a1+a2) + (b1+b2).x

表明y1+y2也是O(n)

答案 6 :(得分:2)

那是对的。只要图表上的直线是直线,无论角度如何,函数都是O(n)。当你可以说&#34时,函数需要线性时间;对于每个输入项,此函数需要x秒。&#34;在这种情况下,x可以是三个,或九个,或一百万个,它仍然是线性函数。

答案 7 :(得分:2)

已经有很多好的答案,但我没有从这个角度看到答案。 O(x)+ O(y)的总和是O(x)和O(y)中最差的。在这种情况下,因为它们都是线性的,比如说x = C1ny = C2n,而C1&gt; C2。因此x支配O()函数,big-O将支配O(C1n) => O(n)