假设我有一个线性函数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^bn
for 形式的任何函数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
。