一、定义
对于任何函数 f(n) 都可以用 O,Ω,Φ 来表示当 n→∞ 时的阶的情况,可以把 O,Ω,Φ 分别看成是 ≥,≤,= ,分别估计了函数的渐进上界,渐进下届和准确界。定义表示如下:
1.第一种定义:
设函数 f(n) 代表某一算法在输入大小为 n 的情况下的工作量(效率),假设
f(n) 、 g(n) 非负单调,且极限存在,则当 n 趋于无穷的时候,我们将
f(n) 与另一行为已知的函数 g(n) 进行比较:
1)如果,则称 f(n) 在数量级上严格小于 g(n) ,记为 f(n)=o(g(n)) 。
2)如果,则称 f(n) 在数量级上严格大于 g(n) ,记为 f(n)=ω(g(n)) 。
3)如果,这里c为非零常数,则称 f(n) 在数量级上等于 g(n) ,记为 f(n)=Θ(g(n)) 。
4)如果 f(n) 在数量级上小于或等于 g(n) ,则记为 f(n)=O(g(n)) 。
5)如果 f(n) 在数量级上大于或等于 g(n) ,则记为 f(n)=Ω(g(n)) 。
2.O表示法第二种定义
对于非负函数 T(n) ,存在两个正常数 c和n0 ,并且对于所有的 n>n0 ,有 T(n)≤cf(n) ,则称 T(n) 在集合 O(f(n)) 里(即前一个集合可以被后一个集合覆盖),记为 T(n)=O(f(n)) ,直观意义是,对于足够大的数据集合,本算法执行的步骤数总是少于 cf(n) 。我们在进行算法分析时希望获得的是尽可能紧凑的上界。
上述算法计算时间的渐进表示是由D.Knuth提出的,但是在数学家眼中 f(n)=O(g(n)) 这种等于号是不严格,但这没关系,不影响计算机算法的分析。
二、 O,Ω,Θ 的性质
利用这些性质可以大大简化对算法的分析。
1)性质1 O,Ω,Θ 是自反的、传递的。例如:
· 自反性, f(n)=O(f(n))
·传递性,若 f(n)=O(g(n)),g(n)=O(h(n)) ,则 f(n)=O(h(n)) 。
2)性质2 Θ还有对称性: f(n)=Θ(g(n))⟺g(n)=Θ(f(n)) 。
3)性质3 对于任意的 f(n),g(n) ,我们有 f(n)+g(n)=Θ(max{f(n),g(n)}) ,即对于一个由若干部分组成的串行程序,其总的渐进复杂度等于其复杂度最高的部分,这是个十分有用的性质。
4)性质4 如果 f(n)=O(kg(n)) ,这里k是一个常数,则 f(n)=O(g(n)) ,这条规则告诉我们系数是无关紧要的。因为我们关心的是数量级的比较,而不是同一数量级里面的细小差异。当然当关注点不同时,系数可能会变得重要。
5)性质5 如果 f1(n)=O(g1(n) ,并且 f2(n)=O(g2(n) ,则 (f1+f2)(n)=O(max{g1(n),g2(n)}) .
6)性质6 如果 f1(n) 在 O(g1(n) 里,并且 f2(n) 在 O(g2(n) 里,则 f1(n)f2(n) 在 O(g1(n)O(g2(n) 里。
参考书:《算法之道》邹横明著。