假设我有一个线性函数f(n)= an+b,证明该函数属于O(n 2)和的最佳方法是什么Θ(n)?
我在这里不需要严格的数学运算。我需要一个程序员的答案。一些合理的解释方式。
这就是为什么我没有在数学问答中发布问题,而是在程序员问答中发布问题的原因。
假设我有一个线性函数f(n)= an+b,证明该函数属于O(n 2)和的最佳方法是什么Θ(n)?
我在这里不需要严格的数学运算。我需要一个程序员的答案。一些合理的解释方式。
这就是为什么我没有在数学问答中发布问题,而是在程序员问答中发布问题的原因。
Answers:
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一样快”

以上两种的结合。它说函数f随着增长“相等快” g。这是一个等价关系。
假设您有两种算法,f和g。
欧米茄
假设
,这
意味着无论您的预算如何,都无法将恒定的计算能力添加到系统中,从而f始终能够以的速度运行g。
大哦
假设
,
意味着您有足够的数据,无论您向系统中添加多少计算能力,其f运行速度总是比快g。
如果您确实想证明这一点,则需要使用Landau符号的定义来证明您的函数满足必要条件。
所以,你需要找到值c,d,n_0使得条件成立。
这是您可以通过以下方式实现此目标的方法c:

重要的是要意识到,我任意定义c为小于a-1完全可以。Theta(g)的定义说“存在一个c”。只要大于0,它就可以是任何值。(如果a是正实数,则您需要稍微更改证明,因为a - 1实际上可能是负数)
(我假设a是正数,否则对于的大值,该函数将始终为负。n这对于表示运行时的函数没有意义。)
您可以尝试将其设置为上限,这非常相似。如果您不知道如何,我可以为您提供证明。
提示:从 d > a + 1
重要的是,不要以错误的方式证明它。如果假设(an + b)在O(n)中并从那里去,则您还没有证明想要的东西。您将需要验证所有的步骤都走的方式,即不是=>你<=>。
在处理多项式时,您只关心多项式的次数。也就是说,因为an + b,您只在乎n。如果是这样an^3 + bn^2 + cn + d,您只会在乎n^3。
因此,次数为d的多项式总是in Θ(n^d)。简单。
现在我们要谈谈Θ和O之间的差异。从本质上讲,分别是==和之间的差异相同<=。因此,Θ(n)意味着它是永远的一个常数因子内n。O(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 形式的任何函数a,b都在中Θ(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。