请解释一下函数an + b属于O(n ^ 2)和Θ(n)的说法。


12

假设我有一个线性函数f(n)= an+b,证明该函数属于O(n 2)和的最佳方法是什么Θ(n)

我在这里不需要严格的数学运算。我需要一个程序员的答案。一些合理的解释方式。

这就是为什么我没有在数学问答中发布问题,而是在程序员问答中发布问题的原因。


2
@EmmadKareem在文学中,经常会随意使用Big O表示狭义界限,基本上是Θ(n)。大O实际上是上限。
极客

1
@EmmadKareem“ O(n)的上限不是n * n。”,没有O(n)的上限。O(n)本身定义上限。它实际上可以包含满足以下条件的一组函数:f(x)∈O(g(x)),因为存在c> 0(例如c = 1)和x0(例如x0 = 5),使得f(x )<cg(x)只要x> x0。
极客

2
@EmmadKareem实际上是O(n)\ subset O(n ^ 2)\ subset O(n ^ 3),依此类推,因此f \ in O(n ^ 2)是\ subset的传递性。请注意,\ subset不是\ subseteq。
Scarridge

6
“我需要一个程序员的答案。一些合理的解释方式。” -那么您如何定义“逻辑”?数学是合乎逻辑的。在这里,只有严格的思考是错误的。您可以尝试解释该主题,但是如果不了解其背后的(否则就不是很难的)数学,您实际上将无法理解它-您只会对其含义有迷惑感。
塔玛斯·塞莱伊(TamásSzelei)2012年

2
@Geek:我猜你是说数学吗?CS.SE也将是一个不错的地址。
拉斐尔

Answers:


20

Big Oh符号(O,Theta,Omega)与功能的增长率有关。

当您实现算法时,它具有一定的特征,即在增加数据集时,运行时间如何变化。现在,您可以优化算法,使其运行速度提高100倍。当然,这很好,但从本质上讲,它仍然是相同的算法。同样,几年后,计算机的速度可能会是今天的两倍。

Landau符号将这些常数因素抽象化。它不在乎一种算法f是否总是总是比另一种算法快两倍g:也许g可以对其进行优化以使其运行速度提高4倍,或者您可以购买速度更快的硬件。如果从这个角度来看,您可能会说它们是“相同的”。(这并不是说您可以(总是)在实践中忽略恒定因素。)

大哦指定了一个上限,它类似于<=关系。

您会同意的1 < 2。这是否意味着1不能少于任何其他数字?当然不是。有无穷多个大于的数字1

就增长率而言,它是相似的。O(n)表示线性增长(或更慢)的所有函数的集合。O(n^2)另一方面,表示所有这些函数,它们以二次逼近度(或更慢)增长。我相信您会同意线性函数的增长要慢于二次函数。

这就是为什么一个函数可以属于多个“ Big-oh”类的原因。

以下是对不同功能的比较约束:(来自Knuth's Concrete数学)

增长率比较

从左到右,功能增长更快。

另外,在此处输入图片说明表示n ^ 2比n ^ 1增长快,因为2> 1。

定义

欧米茄

“ f增长更快或与g一样快”

定义大哦

“ f变慢或与g一样快”

定义Theta

以上两种的结合。它说函数f随着增长“相等快” g。这是一个等价关系。

解释

假设您有两种算法,fg

欧米茄

假设f不在g的theta中,这f在g的欧米茄中意味着无论您的预算如何,都无法将恒定的计算能力添加到系统中,从而f始终能够以的速度运行g

大哦

假设f不在g的theta中f在g的大哦中意味着您有足够的数据,无论您向系统中添加多少计算能力,其f运行速度总是比快g

证明

如果您确实想证明这一点,则需要使用Landau符号的定义来证明您的函数满足必要条件。

所以,你需要找到值cdn_0使得条件成立。

这是您可以通过以下方式实现此目标的方法c

证明

重要的是要意识到,我任意定义c为小于a-1完全可以。Theta(g)的定义说“存在一个c”。只要大于0,它就可以是任何值。(如果a是正实数,则您需要稍微更改证明,因为a - 1实际上可能是负数)

(我假设a是正数,否则对于的大值,该函数将始终为负。n这对于表示运行时的函数没有意义。)

您可以尝试将其设置为上限,这非常相似。如果您不知道如何,我可以为您提供证明。

提示:从 d > a + 1

注意

重要的是,不要以错误的方式证明它。如果假设(an + b)在O(n)中并从那里去,则您还没有证明想要的东西。您将需要验证所有的步骤都走的方式,即不是=><=>


2
而已。太糟糕的人因为数学而大吃一惊,实际上这很简单。
陶Szelei

问题指出:“我在这里不需要严格的数学运算。我需要程序员的答案...” 此答案中使用的表示法看起来不太适合该问题
gna

1
@gnat Hmm,我认为问题曾在某一时刻说“证明”。无论如何,我增加了对数学定义的解释。
phant0m 2012年

@ phant0m很好的答案。正是我在寻找什么。答案中的数学内容更加扎实,即使原始问题中并未特别要求“数学”。万分感谢。
极客

@Geek,很高兴您喜欢它。如果您还有其他问题,请随时提出,我可以澄清/扩大我的答案。
phant0m 2012年

5

在处理多项式时,您只关心多项式的次数。也就是说,因为an + b,您只在乎n。如果是这样an^3 + bn^2 + cn + d,您只会在乎n^3

因此,次数为d的多项式总是in Θ(n^d)。简单。

现在我们要谈谈Θ和O之间的差异。从本质上讲,分别是==和之间的差异相同<=。因此,Θ(n)意味着它永远的一个常数因子内nO(n)表示它始终在n或小于的恒定因子内n

这意味着,在任何功能Θ(s),对于任何s,也将在O(s)。同样,如果一个函数在其中Θ(s)并且s总是少于某个其他函数t,则该函数在in中,O(t)但不是Θ(t)

为了完整起见,这里也有Ω(n)。如果Θ代表==O代表<=Ω代表>=。所以an + bΩ(1)Θ(n)O(n^2)

就像我之前说的,要弄清楚类中的多项式真的很容易-您只需看一下度数即可。还有其他一些易于使用的功能。

a^bnfor 形式的任何函数ab都在中Θ(a^n)。对于任何价值c >= a,他们都在O(c^n)。每个多项式都在中O(2^n)。从本质上讲,这只是说指数函数总是胜过多项式,而指数函数的基础很重要。

对数则相反。其一,log_b n是在Θ(log n)任何b。这意味着底数对数无关紧要。这是有道理的,因为在对数的不同底数之间切换只是乘以一个常数。对数函数也位于O(n)-即,对数函数小于任何多项式(至少为1级)。

给定这些功能的总和,最大的就是“胜利”。之所以这样,n + log nΘ(n)因为该n术语占主导地位log n。乘法更复杂。对于CS,您唯一需要知道的nlog n是介于n和之间n^2


1
非常好。按我的记忆上面的解释是接近经典的算法设计手册,因为它得到
蚊蚋

1
@Tikhlon很好写,所以+1。但是我接受的更好。
极客

-2

不用太多数学,就可以使用函数f(n)= an + b并删除所有常量,因此看起来像是f(n)= n,然后将度数最高的“ n”作为答案QED Θ(n)

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.