如果一个算法是 Θ(g(n)),那么当 n(输入大小)变大时,该算法的运行时间与 g(n) 成比例。
如果一个算法是 O(g(n)),那么当 n 变大时,该算法的运行时间最多成比例于 g(n)。
通常情况下,即使人们谈论 O(g(n)),他们实际上指的是 Θ(g(n)),但从技术上讲,这是有区别的。
O(n) 表示上限。Θ(n) 表示紧密上限。Ω(n) 表示下限。
f(x) = Θ(g(x)) 当且仅当 f(x) = O(g(x)) 且 f(x) = Ω(g(x))。
基本上,当我们说一个算法是 O(n) 时,它也是 O(n2),O(n1000000),O(2n),等等;但是一个 Θ(n) 的算法不是 Θ(n2)。
实际上,因为 f(n) = Θ(g(n)) 意味着对于足够大的 n 值,f(n) 可以在某些 c1g(n) 和 c2g(n) 值内被限制,即 f 的增长率和 g 是渐近相等的:g 可以是 f 的下限,同时也可以是上限。这直接意味着 f 也可以是 g 的下限和上限。因此:
f(x) = Θ(g(x)) 当且仅当 g(x) = Θ(f(x))。
同样地,要显示f(n) = Θ(g(n)), 只需证明g是f的上界(即f(n) = O(g(n))),并且f是g的下界(即f(n) = Ω(g(n)),这与g(n) = O(f(n))是完全相同的)。简而言之,
f(x) = Θ(g(x))当且仅当f(x) = O(g(x))且g(x) = O(f(x))
还有小o和小omega (ω
)符号表示函数的松弛上界和松弛下界。
总结一下:
f(x) = O(g(x))
(大O符号)意味着f(x)
的增长速度渐进地小于或等于g(x)
的增长速度。
f(x) = Ω(g(x))
(大Ω符号)意味着f(x)
的增长速度渐进地大于或等于g(x)
的增长速度。
f(x) = o(g(x))
(小o符号)意味着f(x)
的增长速度渐进地小于g(x)
的增长速度。
f(x) = ω(g(x))
(小omega符号)意味着f(x)
的增长速度渐进地大于g(x)
的增长速度。
f(x) = Θ(g(x))
(theta符号)意味着f(x)
的增长速度渐进地等于g(x)
的增长速度。
g(x)
的增长率>= \Omega(...)
是什么意思?如果我们说它是 \Omega(...)
的成员,我能理解,但如果它大于它呢?这有什么意义吗? - Johannes Schaub - litb有一个简单的方法(我猜是一个技巧),可以记住每个符号代表什么意思。
所有的大O符号都可以看作有一条横杠。
当看到Ω时,横杠在底部,因此它是(渐进)下界。
当看到Θ时,横杠显然在中间。因此,它是(渐进)紧密界限。
写O的时候,通常会在顶部完成并画出一个波浪线。因此,O(n)是函数的上界。公正地说,这个方法不适用于大多数字体,但这是名称最初的理由。
一个是大O表示法
一个是大Theta表示法
http://en.wikipedia.org/wiki/Big_O_notation
大O意味着您的算法的执行步骤不会超过给定表达式(n^2)
大Omega意味着您的算法的执行步骤不会少于给定表达式(n^2)
当同一表达式同时满足这两个条件时,您可以使用大Theta表示法...
不提供理论定义,因为这里已经有了很好的概括,我会给一个简单的例子:
假设 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);
}
Θ(n)
的代码片段的运行时间将随着n的增加而线性增长,例如,运行时间T可以表示为T(n)=a*n+b。对于小的n值(例如n=1或2),这可能不是描述行为的最佳方式——也许您有一些初始化代码需要比f(i)更长时间。 - kara deniz一张图表可以更好地理解之前的答案:
简单地说,左边有一个上界和一个下界都是同阶数量级(即g(n))。忽略常数,如果上下界同阶数量级,那么可以正确地说f(n)=Θ(g(n))或f(n)属于大theta符号g(n)。
右边是一个更简单的例子,它表示上界g(n)仅仅是数量级,忽略常量c(正如所有的大O符号一样)。
Theta是一个简写的术语,用来指代大O和Omega相同的特殊情况。
因此,如果有人声称The Theta is expression q
,那么他们也必然声称Big O is expression q
和Omega is expression q
。
粗略类比:
如果: Theta声称,“那只动物有5条腿。” 那么就可以得出结论: Big O是真的(“那只动物腿的数量小于或等于5”) 并且 Omega是真的(“那只动物腿的数量大于或等于5”)
这只是一个粗略的类比,因为这些表达式不一定是具体的数字,而是不同阶数的函数,例如log(n),n,n^2等。
让我们考虑对于所有的 n
,f(n) > 0
和 g(n) > 0
。这是可以考虑的,因为最快的真实算法至少有一个操作并在开始后完成执行。这将简化计算,因为我们可以使用值 (f(n)
) 而不是绝对值 (|f(n)|
)。
f(n) = O(g(n))
General:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ g(n)
For g(n) = n
:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ n
Examples:
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
Counterexamples:
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))
General:
f(n)
0 < lim ──────── < ∞
n➜∞ g(n)
For g(n) = n
:
f(n)
0 < lim ──────── < ∞
n➜∞ n
Examples:
Expression Value of the limit
------------------------------------------------
n = Θ(n) 1
1/2*n = Θ(n) 1/2
2*n = Θ(n) 2
n+log(n) = Θ(n) 1
Counterexamples:
Expression Value of the limit
-------------------------------------------------
n ≠ Θ(log(n)) ∞
1/2*n ≠ Θ(sqrt(n)) ∞
2*n ≠ Θ(1) ∞
n+log(n) ≠ Θ(log(n)) ∞
n ≠ Θ(n*log(n)) 0
n ≠ Θ(n²) 0
n ≠ Θ(nⁿ) 0