下面是算法的阶的定义。
若存在常量k和n0,使算法A在解决规模n>=n0的问题时,需要的问题单元不大于k*f(n),则算法A为f(n)阶,表示为O(f(n))。
O(f(n))定义中的条件n>=n0正式阐明了问题规模足够大的概念,一般地,有很多k和n值可以满足这个定义。大O表示法的几个数学属性有助于简化算法分析。在讨论这些属性是要记住,O(f(n))意为f(n)阶,O并不是一个函数。
1)可忽略算法增率函数的低阶项。
2)可忽略算法增率函数中高阶项的倍数常量。
3)O(f(n))+O(g(n))=O(f(n)+g(n))可组合增率函数。
来源: <http://blog.csdn.net/chenloug/article/details/6917244>
对于任何数学函数,这三个记号可以用来度量其“渐近表现”,即当趋于无穷大时的阶的情况,这是算法分析中非常重要的概念。大家可以把它们分别想象成≤、≥和,分别估计了函数的渐近上界、渐近下界和准确界。诚然,渐近关系和确切大小关系是有区别的,但当问题规模很大时,忽略这种区别能大大降低算法分析的难度。
下面我们就来具体定义这三种记号的表示。
设函数f ( n )代表某一算法在输入大小为n的情况下的工作量(效率),则在n趋向很大的时候,我们将f (n)与另一行为已知的函数g(n)进行比较:
1)如果0,则称f (n)在数量级上严格小于g(n),记为f (n)=o( g(n))。(小o表示法)
2)如果正无穷,则称f (n)在数量级上严格大于g(n),记为f (n)=( ( g(n))。(?)
3)如果c,这里c为非0常数,则称f (n)在数量级上等于g(n),即f (n)和g(n)是同一个数量级的函数,记为:f (n)=Θ( g(n))。
4)如果f (n)在数量级上小于或等于g(n),则记为f (n)=O( g(n))。(大O表示法)
5)如果f(n)在数量级上大于或等于g(n),则记为f (n)=Ω( g(n))。
这里我们假定f (n),g (n)是非负单调的,且极限存在。如果这个极限不存在,则无法对f (n)和g (n)进行比较。在进行此种计算时,一个经常用到的技术是洛必达(L'Hopital)法则。该法则由17世纪法国数学家Guillaume de L'Hopital发现(也有人认为是瑞士数学家Johann Bernoulli发现的)。该法则声称,两个函数的比率极限等于两个函数的导数的比率极限,这里当然假定两个函数的导数比率的极限存在,即有:
有了这个定义,就可以对素性测试的两个算法进行比较了。
,符合第1个定义,因此这两个素性测试算法的效率差异是数量级的差异。
在算法分析中,最常选取的g(n)有如下一些,见表2-1。
一个值得提醒的问题是,根据定义,对于任意一个g (n)函数来说,可能存在很多个函数f (n),使得f (n)=O(g(n)),即O(g(n))表示的实际上是一个函数的集合,这里的等于也不是普通意义上的等于,而是说明f (n)是函数集合o(g(n))里的一员,即f (n)=O(g(n))并不意味着f (n)等于O(g(n))。等于号的这种使用令那些严谨的科学家非常不快甚至愤怒,但计算机界人士很喜欢这种马虎的表示。不过,我们在心里应该知道,f (n)=O(g(n))并不意味着f (n)≠O(g(n))。不然,我们就被自己骗了!
等号在其他渐近表示中的使用也可以同样解释。
来源: <http://book.2cto.com/201211/8127.html>