算法分析常用记号

下面四种记号是为了建立函数间的相对级别。
CLRS上的一张图很直观:
算法分析常用记号_第1张图片

大O记号

定义:如果存在正常数 c c n0 n 0 ,使得当 Nno N ≥ n o T(N)cf(N) T ( N ) ≤ c f ( N ) ,记 T(N)=O(f(N)) T ( N ) = O ( f ( N ) )

举个栗子:
N<1000 N < 1000 时, 1000N>N2 1000 N > N 2 ,但 N2 N 2 增长率更大,所以最终 N2 N 2 会更大,即 O(N2)=1000N O ( N 2 ) = 1000 N

也就是说,总会存在某个点 n0 n 0 ,从这个点以后 cf(N) c f ( N ) 至少和 T(N) T ( N ) 一样大,忽略常数因子,即 T(N) T ( N ) 增长率小于等于 f(N) f ( N ) 的增长率。

那么为什么这个常数因子 c c 可以忽略呢?
Nno N ≥ n o 时, T(N)cf(N) T ( N ) ≤ c f ( N ) ,也就是 T(N)f(N)c T ( N ) f ( N ) ≤ c 。此时如果 T(N) T ( N ) 增长率大于 f(N) f ( N ) 的增长率,那么 T(N)f(N) T ( N ) f ( N ) 不可能小于某个常数,也就是 c c 不存在,与我们的前提条件矛盾,所以说忽略掉常数因子后, T(N) T ( N ) 增长率仍然小于等于 f(N) f ( N ) 的增长率。

那么既然 T(N) T ( N ) 是以不快于 f(N) f ( N ) 的速度增长,也就可以说 f(N) f ( N ) T(N) T ( N ) 的一个上界(upper bound)。

Ω Ω 记号

定义:如果存在正常数 c c n0 n 0 ,使得当 Nno N ≥ n o T(N)cg(n) T ( N ) ≥ c g ( n ) ,记 T(N)=Ω(g(n)) T ( N ) = Ω ( g ( n ) )

与上述大O的分析类似,可知:
T(N) T ( N ) 增长率大于等于 g(N) g ( N ) 的增长率, g(N) g ( N ) T(N) T ( N ) 的一个下界(lower bound)。

Θ Θ 记号

定义:当且仅当 T(N)=Ω(h(n)) T ( N ) = Ω ( h ( n ) ) T(N)=O(h(n)) T ( N ) = O ( h ( n ) ) 时,
T(N)=Θ(f(n)) T ( N ) = Θ ( f ( n ) )

那么这个就是说 T(N) T ( N ) 增长率等于 h(N) h ( N ) 的增长率。

小o记号

定义:若 T(N)=O(p(n)) T ( N ) = O ( p ( n ) ) T(N)Θ(p(n)) T ( N ) ≠ Θ ( p ( n ) ) 时,
T(N)=o(f(n)) T ( N ) = o ( f ( n ) )

与大O不同,小o表示 T(N) T ( N ) 增长率小于 p(N) p ( N ) 的增长率,不包括等于。

你可能感兴趣的:(算法)