大O表示法
最常用来描述渐进复杂度引入大O表示法,给定两个正值函数f和g。
定义:
如果存在正数c和N,对于所有的n>=N,有f(n)<=cg(n),则f(n)=O(g(n)).
上述定义表明,如果对于足够大的n(或大于某自然数的N的n)存在正数c时f不大于cg,则f为g的大O表示法
f(n)=2n2+3n+1=O (n2)
为了选择更好的c和N,规定某个N值,f中的某项应该时最大项,在等式中只有2n2和3n可能是最大项,但是当n>1.5时,2n2>3n,他们都与同一函数对g(n)=n2和f(n)有关,对于固定的g,可以得出无穷多的常数对c和N,关键在于g和f以相同速率增长。大O表示中固有的不精确性还会导致其他问题,所以大O表示法定义中的f(n)用n2代替,n2为f(n)的大O表示
2n2+3n+1<=cn2
大O表示法的性质
- (传递性)如果f(n)=O(g(n)),g(n)=O(h(n)),那么f(n)=O(h(n))(或者O(O(g(n)))=O(g(n)))
证明:
根据定义若存在正数c1和N1,对于所有的n>=N1,有f(n)<=c1g(n),则f(n)=O(g(n));同样,若存在正数c2和N2,对于所有n>=N2,有g(n)<=c2h(n),则g(n)=O(h(n))。因此,对于所有n>=N,其中N为N1与N2中的较大者,有c1g(n)<=c1c2h(n),只要取c=c1*-c2,则对于所有的n>=N有f(n)<=ch(n),即f(n)=O(h(n))。 - 如果f(n)=O(h(n)),g(n)=O(h(n)),则f(n)+g(n)=O(h(n))
证明:
令c=c1+c2,则有f(n)+g(n)<=ch(n)。 - ank=O(nk)
证明:
令c>=a,不等式ank<=cnk恒成立。 - 对于任何正数j,nk=O(nk+j)。
证明:
令c=N=1,成立
从上面的性质可以推出,任何多项式都是该多项式中次数最高的大O表示。
对数函数是算法效率评估中一个非常重要的函数。实际上,如果算法复杂度是一个对数函数,那么该算法非常好
性质: - 如果f(n)=cg(n),则f(n)=O(g(n)).
- 对于任何正数a和b(b!=1),loga(n)=O(logb(n))。
该性质说明对数函数之间存在对应关系,性质6表明,无论底数为何,对数函数互为大O表示也就是说所有的对数函数有相同的增长速度。 - 对于任何正数a!=1,loga(n)=O(lg(n)),其中lg(n)=log2(n)。