有时我看到Θ(n)带有奇怪的Θ符号,中间有一些东西,有时只有O(n)。这只是打字的懒惰,因为没有人知道如何输入这个符号,或者它是否意味着不同的东西?
答案 0 :(得分:574)
如果算法是Θ(g(n)),则意味着算法的运行时间n(输入大小)变大,与g(n)成正比。
如果算法是O(g(n)),则意味着算法的运行时间越长,最多与g(n)成比例。
通常,即使人们谈论O(g(n)),他们实际上也意味着Θ(g(n)),但从技术上讲,存在差异。
O(n)表示上限。 Θ(n)表示紧束缚。 Ω(n)表示下限。
f(x)=Θ(g(x))iff f(x)= O(g(x))和f(x)=Ω(g(x))
基本上当我们说算法是O(n)时,它也是O(n 2 ),O(n 1000000 ),O(2 n ),...但是Θ(n)算法不Θ(n 2 )。
事实上,由于f(n)=Θ(g(n))意味着对于足够大的n值,f(n)可以被绑定在c 1 g(n)和c中对于c 1 和c 2 的某些值, 2 g(n),即f的生长速率渐近等于g:g can是下限和以及f的上限。这直接暗示f也可以是g的下限和上限。因此,
f(x)=Θ(g(x))iff g(x)=Θ(f(x))
类似地,为了显示f(n)=Θ(g(n)),足以表明g是f的上界(即f(n)= O(g(n)))并且f是a g的下限(即f(n)=Ω(g(n)),其与g(n)= O(f(n))完全相同。简明地,
f(x)=Θ(g(x))iff f(x)= O(g(x))且g(x)= O(f(x))
还有一些小哦和小欧米茄(ω
)符号表示函数的松散上边界和松散下界。
总结:
f(x) = O(g(x))
(大哦)意味着f(x)
的增长率是。{1}} 渐近小于或等于 增长率为g(x)
。的增长率
f(x) = Ω(g(x))
(big-omega)意味着f(x)
的增长率是。g(x)
渐近大于或 等于f(x) = o(g(x))
f(x)
(小哦)意味着g(x)
的增长率是。{1}} 渐近小于 增长率为f(x) = ω(g(x))
。
f(x)
(little-omega)表示g(x)
的增长率是。f(x) = Θ(g(x))
渐近大于 增长率f(x)
g(x)
(theta)意味着 {{1}}的增长率是。{1}} 渐近等于 增长率{{1}}
有关更详细的讨论,您可以read the definition on Wikipedia或参考经典教科书,如Cormen等人的算法导论
答案 1 :(得分:307)
有一种简单的方法(一种技巧,我猜)要记住哪种符号意味着什么。
所有Big-O符号都可以被视为有一个标准。
当查看Ω时,条形位于底部,因此它是(渐近)下限。
当看到Θ时,酒吧显然位于中间。所以它是一个(渐近)紧束缚。
当手写O时,你通常会在顶部完成,然后画一个波浪形。因此O(n)是函数的上界。公平地说,这个不适用于大多数字体,但这是名称的原始理由。
答案 2 :(得分:54)
一个是大“O”
一个是Big Theta
http://en.wikipedia.org/wiki/Big_O_notation
Big O意味着您的算法将不会执行比给定表达式(n ^ 2)
更多的步骤Big Omega意味着您的算法将以比给定表达式(n ^ 2)
更少的步骤执行如果同一个表达式的条件都为真,则可以使用大的θ表示法....
答案 3 :(得分:34)
我没有提供理论上的定义,而是已经在这里进行了精美的总结,我将举一个简单的例子:
假设f(i)
的运行时间为O(1)
。下面是一个代码片段,其渐近运行时为Θ(n)
。 始终会调用函数f(...)
n
次。下限和上限都是n。
for(int i=0; i<n; i++){
f(i);
}
下面的第二个代码片段具有O(n)
的渐近运行时。它最多调用函数f(...)
n
次。上限为n,但下限可以是Ω(1)
或Ω(log(n))
,具体取决于f2(i)
内发生的情况。
for(int i=0; i<n; i++){
if( f2(i) ) break;
f(i);
}
答案 4 :(得分:10)
Theta是一种简短的方式,指的是一种特殊的位置 大O和欧米茄是一样的。
因此,如果有人声明The Theta is expression q
,那么他们也必须声明Big O is expression q
和Omega is expression q
。
粗略的比喻:
如果: Theta声称,&#34;那只动物有5条腿。&#34; 然后是: 大O是真的(&#34;那只动物的腿数小于或等于5条。&#34;) 和 欧米茄是真的(&#34;那种动物的腿数超过或等于5腿。&#34;)
这只是一个粗略的类比,因为表达式不一定是特定的数字,而是具有不同数量级的函数,例如log(n),n,n ^ 2,(等)。
答案 5 :(得分:10)
chart可以让以前的答案更容易理解:
英文,
在左边,注意有一个上限和下限都是相同的数量级(即 g(n))。忽略常数,如果上限和下限具有相同的数量级,则可以有效地说 f(n)=Θ(g(n))或 f(n)是g(n)的大the。
从正确的,更简单的例子开始,它说上限 g(n)只是数量级并忽略常量 c (正如所有大O 表示法都有。)
答案 6 :(得分:6)
f(n)
如果O(n)
存在肯定k
,则属于f(n)<=k*n
f(n)
属于Θ(n)
,如果存在正k1
,k2
为k1*n<=f(n)<=k2*n
答案 7 :(得分:4)
结论:我们认为大O,大θ和大Ω是一样的。
为什么呢?我将在下面说明原因:
首先,我将澄清一个错误的陈述,有些人认为我们只关心最糟糕的时间复杂性,所以我们总是使用大O而不是大θ。我会说这个男人是胡说八道。上限和下限用于描述一个函数,不用于描述时间复杂度。最差时间函数有其上限和下限;最好的时间函数也有其上限和下限。
为了清楚地解释大O和大θ之间的关系,我将首先解释大O和小O之间的关系。从定义中,我们可以很容易地知道小o是大O的子集。例如:
T(n)= n ^ 2 + n,我们可以说T(n)= O(n ^ 2),T(n)= O(n ^ 3),T(n)= O (N ^ 4)。但对于小o,T(n)= o(n ^ 2)不符合小o的定义。因此,只有T(n)= o(n ^ 3),T(n)= o(n ^ 4)对于小o是正确的。冗余T(n)= O(n ^ 2)是什么?这太棒了!
通常,我们说大O是O(n ^ 2),很难说T(n)= O(n ^ 3),T(n)= O(n ^ 4)。为什么?因为我们在潜意识里将大O视为大θ。
同样地,我们也在潜意识里将大Ω视为大θ。
总之,大O,大θ和大Ω与定义不一样,但它们在我们的口腔和大脑中都是一样的。
答案 8 :(得分:3)
让我们考虑所有f(n) > 0
的{{1}}和g(n) > 0
。可以考虑这一点,因为最快的真实算法至少有一个操作并在启动后完成其执行。这将简化微积分,因为我们可以使用值(n
)而不是绝对值(f(n)
)。
|f(n)|
常规强>
f(n) = O(g(n))
适用于 f(n)
0 ≤ lim ──────── < ∞
n➜∞ g(n)
:
g(n) = n
<强>示例:强>
f(n)
0 ≤ lim ──────── < ∞
n➜∞ n
<强>反例:强>
Expression Value of the limit
------------------------------------------------
n = O(n) 1
1/2*n = O(n) 1/2
2*n = O(n) 2
n+log(n) = O(n) 1
n = O(n*log(n)) 0
n = O(n²) 0
n = O(nⁿ) 0
Expression Value of the limit
-------------------------------------------------
n ≠ O(log(n)) ∞
1/2*n ≠ O(sqrt(n)) ∞
2*n ≠ O(1) ∞
n+log(n) ≠ O(log(n)) ∞
常规强>
f(n) = Θ(g(n))
适用于 f(n)
0 < lim ──────── < ∞
n➜∞ g(n)
:
g(n) = n
<强>示例:强>
f(n)
0 < lim ──────── < ∞
n➜∞ n
<强>反例:强>
Expression Value of the limit
------------------------------------------------
n = Θ(n) 1
1/2*n = Θ(n) 1/2
2*n = Θ(n) 2
n+log(n) = Θ(n) 1