根据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
答案 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的数学定义:
用简单的英语:
这两个陈述是等价的:
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 = C1n
和y = C2n
,而C1&gt; C2。因此x支配O()函数,big-O将支配O(C1n) => O(n)