算法时间复杂度
用大写O()来体现算法时间复杂度得记法,称之为大O记法
推导大O阶方法
用常数1取代运行时间中得所有假发常数
在修改后得运行次数函数中,只保留最高阶项
如果最高阶项存在且不是1,则去除和这个项相乘得常数
得到得最后得结果就是大O阶
1》常数阶
例:段代码得大O是多少
int sum = 0, n = 100;
printf(“I love you.com\n”);
printf(“I love you.com\n”);
printf(“I love you.com\n”);
printf(“I love you.com\n”);
printf(“I love you.com\n”);
printf(“I love you.com\n”);
sum = (1+n)*n/2;
第一条就说明了所有加法常数都是 O(1)
2》线性阶
int i , n =
100, sum = 0;
for( i=0; i < n; i++ )
{
sum = sum + i;
}
时间复杂度 O(n)
3》 平方阶
int i, j, n = 100;
for( i=0; i < n; i++ )
{
for( j=0; j < n; j++ )
{
printf(“I love FishC.com\n”);
}
}
时间复杂度O(n^2)
总结:如果有三个这样得嵌套循环就是n^3。总结得出,循环得时间复杂度等于循环体得复杂度乘以循环运行次数
int i, j, n =
100;
for( i=0; i < n; i++ )
{
for( j=i; j < n; j++ )
{
printf(“I love FishC.com\n”);
}
}
内循环则执行n-1次……当i=n-1时,内循环执行1次,所以总的执行次数应该是:
n+(n-1)+(n-2)+…+1 = n(n+1)/2
n(n+1)/2 = n^2/2+n/2
用我们推导大O的攻略只保留最高项,所以n/2这项去掉。第三条,去除与最高项相乘的常数,最终得O(n^2)。
4》对数阶
int i = 1, n = 100;
while( i < n )
{
i = i * 2;
}
由于每次i*2之后,就距离n更近一步,假设有x个2相乘后大于或等于n,则会退出循环。
于是由2^x = n得到x = log(2)n,所以这个循环的时间复杂度为O(logn)。
函数用得时间复杂度分析
常用得时间复杂度所耗费得时间从小到大排序
n!=1*2*3*4*……*n(n个数字)
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
算法得空间复杂度
算法得空间复杂度通过计算算法所需得存储空间时间,算法空间复杂度得计算公式S(n) = O(f(n)),其中n为问题得规模,f(n)为语句关于n所占存储空间得函数
通常用时间复杂度来指运行时间得需求,空间复杂度来指空间需求