我对大 O、大 Omega 和大 Theta 记号之间的区别感到非常困惑。
我知道大 O 是上界,大 Omega 是下界,但是大 Theta 到底代表什么?
我读过它表示紧密界限,但是这是什么意思?
我对大 O、大 Omega 和大 Theta 记号之间的区别感到非常困惑。
我知道大 O 是上界,大 Omega 是下界,但是大 Theta 到底代表什么?
我读过它表示紧密界限,但是这是什么意思?
首先让我们了解一下大O、大Theta和大Omega是什么。它们都是函数的sets。
大O给出上界asymptotic bound,而大Omega给出下界。大Theta同时给出上下界。
所有Ө(f(n))
的内容也都属于O(f(n))
,但反过来则不成立。
如果T(n)
既属于O(f(n))
,又属于Omega(f(n))
,则称其为Ө(f(n))
。
在集合术语中,Ө(f(n))
是O(f(n))
和Omega(f(n))
的intersection。
O(n*log(n))
又是 Omega(n*log(n))
- 因此也是 Ө(n*log(n))
,但它也是 O(n^2)
,因为 n^2
渐进地比它更大。然而,它不是Ө(n^2)
,因为该算法不是Omega(n^2)
。
O(n)
是渐进上界。如果 T(n)
是 O(f(n))
,这意味着从某个 n0
开始,存在一个常数 C
,使得 T(n) <= C * f(n)
。另一方面,大-Omega 表示存在一个常数 C2
,使得 T(n) >= C2 * f(n))
)。
f(n) = 2*n
比 f(n) = n
更"糟糕"。但与另一个函数相比,差异并不是非常显著。我们可以看到,f(n)=logn
很快就比其他函数低得多,而 f(n) = n^2
很快就比其他函数高得多。
因此,由于上述原因,我们会“忽略”常数因子(例如图表中的2*),只考虑大O符号。f(n)=n, f(n)=2*n
都属于 O(n)
和 Omega(n)
- 因此也属于 Theta(n)
。
f(n)=logn
属于 O(n)
(它比 f(n)=n
“更好”),但不属于 Omega(n)
- 因此也不属于 Theta(n)
。
f(n)=n^2
属于 Omega(n)
,但不属于 O(n)
,因此也不是 Theta(n)
。
1通常情况下,虽然不总是如此。当分析类别(最差、平均和最好)缺失时,我们实际上指的是最坏情况。
f(n) = n^2
渐进地比n
更强,因此是大Omega(n)。但它不是O(n)(因为对于大的n
值,它比所有的c*n
都要大)。由于我们说Theta(n)是O(n)和大Omega(n)的交集,因为它不是O(n),所以它也不能是Theta(n)。 - amitT_best(n), T_worst(n), T_average(n)
。它们不必相同(大多数情况下不同)。O/Omega/Theta可以独立应用于其中任何一个。 - amit这意味着算法在给定的函数中同时具有大O和大Ω。
例如,如果它是 Ө(n)
,那么存在某个常数 k
,使得您的函数(运行时间等)对于足够大的 n
大于 n*k
,还有另一个常数 K
,使得您的函数对于足够大的 n
小于 n*K
。
换句话说,对于足够大的 n
,它被夹在两个线性函数之间:
对于 k < K
并且足够大的 n
,n*k < f(n) < n*K
Theta(n):如果存在正常数c1
和c2
,使得函数f(n)
夹在c1(g(n))
和c2(g(n))
之间,则函数f(n)
属于Theta(g(n))
。即它给出上限和下限。
Theta(g(n)) = { f(n) : 存在正常数c1、c2和n1,使得对于所有n >= n1,0<=c1(g(n))<=f(n)<=c2(g(n)) }
当我们说f(n)=c2(g(n))
或者f(n)=c1(g(n))
时,表示渐近紧密边界。
O(n):它只给出上限(可能是紧的也可能不是)
O(g(n)) = { f(n) : 存在正常数c和n1,使得对于所有n>=n1, 0<=f(n)<=cg(n)}
例如:边界2*(n^2) = O(n^2)
是渐近紧密的,而边界2*n = O(n^2)
不是渐近紧密的。
o(n):它只给出上界(永远不是紧的)
O(n)和o(n)之间的显着区别是f(n)小于cg(n),对于所有n>=n1,但不等于O(n)中的情况。
例如:2*n = o(n^2)
,但2*(n^2) != o(n^2)
首先是理论
大O = 上限 O(n)
Theta = 阶函数 - theta(n)
Omega = Q符号(下限)Q(n)
在许多博客和书籍中,这个语句被强调为:
"这是Big O(n^3)"等等。
人们经常会混淆,比如:
O(n) == theta(n) == Q(n)
但值得记住的是它们只是具有名称O、Theta和Omega的数学函数
因此,它们具有相同的多项式通用公式,
设:
f(n) = 2n4 + 100n2 + 10n + 50,则
g(n) = n4,所以g(n)是一个接受函数作为输入并返回最大幂次变量的函数,
以下所有解释都适用于相同的f(n)和g(n)
Big O(n4) = 3n4,因为3n4 > 2n4
3n4是Big O(n4)的值,就像f(x)=3x一样
n4在这里扮演着x的角色,所以
将n4替换为x,因此Big O(x')=2x',现在我们都很满意,通用概念是
所以0≤f(n)≤O(x')
O(x')=cg(n)=3n4
放入数值,
0 ≤ 2n4 + 100n² + 10n + 50 ≤ 3n⁴
3n⁴是我们的上界
Theta(n⁴)=cg(n)=2n⁴,因为2n⁴≤我们的示例f(n)
2n⁴是Theta(n⁴)的值
因此,0≤cg(n)≤f(n)
0 ≤ 2n4 ≤ 2n4 + 100n2 + 10n + 50
2n4是我们的下界
这是计算以确定下界是否类似于上界的过程,
情况1)。 上限类似于下限
if Upper Bound is Similar to Lower Bound, The Average Case is Similar
Example, 2n4 ≤ f(x) ≤ 2n4,
Then Theta(n) = 2n4
In this case, Theta(n) is not fixed but Theta(n) is the set of functions with the same order of growth as g(n).
Example 2n4 ≤ f(x) ≤ 3n4, This is Our Default Case,
Then, Theta(n) = c'n4, is a set of functions with 2 ≤ c' ≤ 3
我不确定为什么没有简短明了的答案用通俗易懂的英语解释大O符号(好像这就是问题),所以在这里我来解释一下。
大Theta表示函数所需操作增长的范围或确切值(如果大O和大Omega相等)。