算法时间复杂度的推导大O阶法
(1)用常数1取代运行时间中的所有加法常数。
(2)在修改后的运行次数函数中,只保留最高阶数。
(3)如果最高阶顶存在且不是1,则去除与这个项相乘的常数。
事实上,循环的时间复杂度就是循环体的复杂度乘以循环运行的次数。
算法举例:
1、常数阶
int sum = 0,n = 100;
sum = (1+n)*n/2;
printf("%d\n",sum);
f(n)=3,则时间复杂度为O(1)。
2、线性阶
int i,n;
for(i=0;i<n;i++)
{
时间复杂度为O(1)的操作
}
循环体中共循环了n次,时间复杂度为O(n)
3、对数阶
int count=0,i;
while(count<n)
{
count=2*count;
时间复杂度为O(1)的操作
}
分析循环的条件是(count<n),每一次循环count的值就为原来的2倍,相当于一个等比数列。当循环结束时,count=n。此时,假设乘了x个2使得count=n,那么就有2^x=n,解得x=log(2) n,时间复杂度为O(log n)(舍去底数)
4、平方阶
int i,j,n;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
时间复杂度为O(1)的操作;
}
}
分析:内层循环随外层循环的改变而改变。
当 i=0 时,j=0,内循环执行 n次;
当 i=1 时,j=1,…(n-1)次;
当 i=2 时,j=2,…(n-2)次;
.
.
.
当 i=n-1 时,j=n-1,…1次;
则总的执行次数为:
n+(n-1)+(n-2)+…+1=(n^2+n)/2
根据推导大O阶的方法,只保留最高阶项并去除常数,所以时间复杂度为O(n^2)。