Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python O(n)及"x2B ;;O(n)=O(n)?_Python_Algorithm_Big O - Fatal编程技术网

Python O(n)及"x2B ;;O(n)=O(n)?

Python O(n)及"x2B ;;O(n)=O(n)?,python,algorithm,big-o,Python,Algorithm,Big O,根据Alex Martelli在O'Reilly的Python中的概括,复杂性类O(n)+O(n)=O(n)。所以我相信。但是我很困惑。他解释说,“两个N的线性函数之和也是一个N的线性函数。” 根据,在函数分析中,线性函数是一个线性映射,例如f(x+y)=f(x)+f(y)。发现了一个似乎更简单的定义,简单地说,“线性函数是一个函数,它的图形是一条直线。”它还包括了一些比维基百科文章更不深奥的例子 y = f(x) = a + bx 以及: 也许可以公平地预期,两个线性方程组的和可以在一个图上

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

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

y = f(x) = a + bx
以及:

也许可以公平地预期,两个线性方程组的和可以在一个图上表示为一条直线,它显示了类似于表示每条直线的直线之间的平均值的东西

因此,我是否正确理解,即使在以下两个函数中,“复杂”函数的处理时间是“简单”函数的三倍,它们的每个函数都用大O表示法表示为O(n),因为处理时间的弧线将由绘图/图形上的一条直对角线表示,时间差可以用这样一个事实来表示,在图形上,更复杂的函数的角度会更尖锐

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
正确,O(n)+O(n)=O(n)

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

因此,即使在以下两个函数中,“复杂”函数的处理时间是“简单”函数的三倍,但它们的每个函数都用大O表示法表示为O(n),因为处理时间的弧线将由绘图/图形上的一条直线、对角线表示,即使更复杂的函数的角度会更尖锐

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
对。之所以使用字母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)
是指数型的。您通常不希望编写具有指数复杂性(或更糟)的算法。

这是正确的。只要图上的直线是直线,不管角度如何,函数都是O(n)。当你可以说“此函数对每个输入项花费x秒”时,函数需要线性时间。在这种情况下,x可以是3秒、9秒或100万秒,但它仍然是一个线性函数。

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

用通俗易懂的英语:

这两种说法是等价的:

  • fO(g)

  • f(n)g(n)的比率随着n的增加趋于非负值


在我们的例子中,我们有g(n)=n。现在,如果我们让f(n)=f1(n)+f2(n)并假设f1f2都是O(n),那么上面的极限将等于α=α1+α2,其本身必须大于或等于零(因为根据定义α1≥ 0α2≥ 0)。因此,根据我们的定义,f1(n)+f2(n)也是O(n)。

是的,这是因为Big-O符号不是用来计算绝对运行时间,而是用来描述输入不断增加的算法行为

换句话说,如果你有一些算法在
O(3n)
O(n)
中工作,并且你增加
n
,但是你希望它们都能运行更长的时间

它只是给出了一个概念,如果一个算法在增加输入的某个点上会超过另一个算法


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

这句话是正确的,因为两个线性函数的相加也是一个线性函数。以这两项为例:

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)

假设第一个
O(n)
由一个等式表示:

y1 = f1(x) = a1 + b1.x
y2 = f2(x) = a2 + b2.x
第二个
O(n)
由一个方程表示:

y1 = f1(x) = a1 + b1.x
y2 = f2(x) = a2 + b2.x
加上双方,

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

这表明
y1+y2
也是
O(n)

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

你的问题到底是什么?好吧,big-O并不太担心这个尺度下的精度。它实际上用于比较O(n)与O(logn)与O(3^n)等。在大Oh分析中,一般来说,你会丢弃常量前导系数和常量。因此,
=
肯定是滥用符号。@Rhymoid+1。这应该更像是对一切都安全的一种说法,希腊符号的说法让我难以理解。我也不太明白
g(x)=x
从何而来。X是一个值,对吗?我们的意思是g(x)=x的(值)结果吗?@arshajii我认为您需要从第一个语句中删除
n
。这应该是“lim sup”而不是“lim”。f/g的极限不一定存在,我有b