Big-O-Notation的常规运行时有变化吗?


9

有多个O表示法,例如O(n)O(n2)等。我想知道,实际上是否存在诸如O(2n2)O(logn2),或者在数学上是不正确的。

或者说可以将O(5n2)O(3n2)吗?我不能也不需要弄清楚运行时,也不需要改善任何事情,但是我需要知道这是否是您如何在现实中描述您的功能。


1
在渐近分析中,O(5n ^ 2)与O(3n ^ 2)之间没有实质性差异。它们都是O(n ^ 2),并且仅相差一个常数。实际上,在证明中,您甚至可以将O(5n ^ 2)减少为O(3n ^ 2)或O(n ^ 2),以使数学更清晰,因为它们是等效的。在编写证明时,您会在边栏中记下它们是等效的。实际上,您甚至可以将O(log n)与O(n)交换,并注意侧栏中的O(log n)<= O(n)。侧栏中的注释告诉读者这是故意的,而不是错字。(至少这是我上大学时进行算法分析的方式)。
jww

2
如果您使用表示法消除小因素,则始终可以编写类似“ ...,将运行时间从5 n 2 + o n 2减少到3 n 2 + o n 2 ”等。或者等效地,5 + o 1 n 23 + o 1 n 2O()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n2。一些学者更愿意只写速记前者。参见,例如,Trefethen和Bau的教科书。5n2
Yonatan N

Answers:


21

我想知道,现实中是否存在诸如O(2n2)O(log(n2)),或者这些变化在数学上是不正确的。

是的,O(2n2)O(log(n2))是有效的变体。

但是,如果您根本看不到它们,那么您将很少看到它们,尤其是在最终结果中。原因是O(2n2) O(n2)。同样,O(log(n2)) O(logn)。对于初学者而言,这可能令人惊讶。但是,这些相等性或多或少是引入大O表示法的原因,以掩盖通常难以确定且相对微不足道的可乘常数。

难道是一个正确的说,它是能够提高O(5n2)O(3n2)

这不是在所有的改进,如果一种算法的时间复杂度从改变O(5n2)O(3n2)或从Ω(5n2)Ω(3n2),因为O(5n2)O(3n2)Ω(5n2)Ω(3n2)。所以说时间复杂度从O(5n2)O(3n2)是不正确的。当然,可以说算法的时间复杂度从5n2提高到3n2是正确的。


练习1.证明O(5n2)=O(3n2)=O(n2)

练习2。证明O(logn)=O(log(n2))

练习3.显示Ω(n2+n)=Ω(n2)


1
@bv_Martn这里有一个很好的链接了解什么符号被定义为(只是简单的限制微积分!):math.stackexchange.com/questions/925053/...O(n)
Akshat马哈詹

2
我唯一一次看到big-O表示法的恒定因素是,有人想指出一点,尽管两种算法属于同一复杂度类别,但是其中一种算法严格比另一种算法快。
标记

7
@AkshatMahajan 这个问题的唯一答案/math/925053显然是错误的。大的标记有很多可靠的来源。O
John L.

1
“可以说,算法的时间复杂度从5n ^ 2提高到3n ^ 2是正确的-尽管确切的运行时间通常因输入大小和值的不同而有所不同。另外,这涉及对所有操作进行加权/只关注一个操作,这可能并不能说明您将在现实世界中获得的恒定因素,也不能与使用不同权重的其他算法相提并论。因此,尽管它可能有一些有效的用例,但是像上面这样说是有限的用途(这可能是为什么它很少见的原因)。
迪克林

1
@Mark:那是完全错误的。
user21820

13

f(n)f(n)g(n)f(n)

不必将Big Oh符号视为神秘的魔术,而必须咨询巫师询问您是否可以做某事,而应查看其定义。遵守定义,然后做任何您需要完成的工作。


好吧,我实际上还不需要它。或者实际上从理论上讲,我只需要知道是否存在由维基百科给出的定义O(1)-O(n!),或者实际上,如果它们不同,您是否可以用不同的方式来描述它们,例如O (7N)。我担心如果我使用数学教授会松开翅膀
bv_Martn

1
O(1)O(n!)

6
@bv_Martn数学教授更容易跳槽,因为您正在查看的示例列表是定义列表。因此,数学的许多重点是以一种使事物能够普遍运行的方式定义事物,而不仅仅是在特定情况下。您的问题基本上是“维基百科说我可以加一个再加两个再加十七个。但是我也可以加其他数字吗?”的更高级版本。
大卫·里希比

7

O(n)=O(2n)

Big-O符号描述可伸缩性

从本质上讲,Big-O符号不是一种算法运行多长时间的描述。也没有描述算法执行多少步骤,代码行或比较。当用于描述算法如何随输入数量缩放时,它非常有用。

O(logn)。对数以2为底,但这没关系-关系的核心是将列表乘以一个常数,只会给时间加上一个常数。

nnO(n)O(2n)O(n)

我很高兴看到许多这样的答案基本上都在告诉您自己通过阅读Big-O的定义得出这个结论。但是这种直觉上的理解使我花了相当长的时间来回想一下,所以我尽可能简单地向您展示。


5
O(n)

3
@Juho具有指导性,也许对大多数计算机科学家来说毫无用处。
散布

4
对此,我必须不同意。称自己为计算机科学家不应成为不理解一个符号所使用的含义的借口,即跳过所有数学。
Juho

3
是的 我不反对程序员不了解这些内容,但是如果您想称自己是计算机科学家,那么这就是核心材料。
大卫·里希比

2
@dkaeae不,我指的是从事该领域其他职业的人员,例如软件开发人员。
散布

5

O(f)fg(n)=O(f(n))cg(n)cf(n)nf

g(n)=O(f(n))g(n)=O(2f(n))g(n)cf(n)ng(n)c22f(n)g(n)=O(2f(n))c/2

logn2log(n2)2logn

O


4

查看O(f(n))的定义,您会看到例如O(2n ^ 2)和O(n ^ 2)完全相同。将算法从5n ^ 2更改为3n ^ 2操作可提高40%。从O(5n ^ 2)更改为O(3n ^ 2)实际上没有任何变化,它们是相同的。

再次,读取O(f(n))的定义。


4

O(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

=

O(n)=O(2n)


4
log(n!)=nlognn+O(logn)O(f)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.