推导大O阶的方法
1、用常熟1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不为1,则去除与这个项相乘的常数。
应用:
①常数阶
int sum=0,n=1000; sum=(1+n)*n/2; printf("%d",sum);
以上是顺序结构的时间复杂度,这个算法的运行次数函数是f(n)=3。根据上面的方法,第一部就是把常数改成1,。在保留最高阶时发现,它根本没有最高阶项,所以它的时间复杂度是O(1)。
对于分支结构而言,无论是真,还是假,执行的次数都是恒定的,不会随着n的变化而发生变化,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O(1)。
②线性阶
要分析算法的复杂度,关键就是要分析循环结构的运行情况。
int i; for(i=0;i<n;i++) { /*时间复杂度为O(1)的程序步骤序列*/ }
上面的代码,它的时间复杂度是O(n),因为循环体中的代码需要执行n次。
③对数阶
int count=1; while (count < n) { count=count * 2; /*时间复杂度为O(1)的程序步骤序列*/ }
由于每次count乘以2之后,就距离n更近了一分。也就是说,有多少个2相乘后大于n,则会退出循环。又2x=n 得到x=log2n。所以找个循环的时间复杂度为O(logn)。
④平方阶
下面的代码是一个循环嵌套,根据上面的分析,内循环的时间复杂度为O(n)
int i ,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { /*时间复杂度为O(1)的程序步骤序列*/ } }
对于外部的循环,不过是内部的循环又循环了n次,所以这段代码的时间复杂度为O(n2)。
如果外循环的次数改成了m,即
int i ,j; for(i=0;i<m;i++) { for(j=0;j<n;j++) { /*时间复杂度为O(1)的程序步骤序列*/ } }
那么时间复杂度就是O(m×n)所以总结得出,循环的时间复杂度等于循环体的复杂度乘以该循环的运行的次数。
常见的时间复杂度
来源:https://www.cnblogs.com/jyh317/archive/2013/05/17/3084124.html