目录
1.算法时间复杂度
算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n)).它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
这样用O[] 来体现时间复杂度,我们称为大 O 记法。
例如 三种求和方法:
第1种方法:
int sum= 0;
int n =100;
sum =(1+n) *n/2;
printf("sum= %d\n",sum);
O[1]
第2种方法:
int i, sum=0,n=100;
for(i=1;i<=n;i++)
sum=sum+1;
}
printf("%d",sum);
O[n]
第3种方法:
int i, j,x = 0,sum=0,n=100;
/*执行一次*/
for(i=l;i<=n;i++)
{
for(j=l;j<=n;j++)
{
x++;
/*执行nxn次*/
sum= sum +X;
}
}
printf("sd",sum);
O[n^2]
2.推导O阶方法
1. 用常数1取代运行时间中的所有加法常数。
2. 在修改后的运行次数函数中,只保留最高阶项。
3. 如果最高阶项存在且不是1, 则去除与这个项相乘的常数。
得到的结果就是大O阶。
1. 常数阶
求和的 第1种方法:
时间复杂度是 O[1] 而不是 O[3].
事实上 无论n是多少 假如有sum =(1+n) *n/2; 13句 ,这种问题与大小无关(n的多少) 执行时间恒定的算法 我们称之为具有 O[1]的时间复杂度的常数阶。
2.线性阶
分析算法的复杂度,主要分析算法的循环情况
求和的 第2种方法:
时间复杂度是O[n],因为 for 里面要执行n次循环。
3.对数阶
下面的这段代码,时间复杂度又是多少呢?
int count=1;
while(count<n)
{
count= count *2;
/*时间复杂度为0(1)的程序步骤序列*/
}
中于每次 count 乘以2之后,就距离n更近了一分。也就是说,有多少个2相乘后大干n, 则会退出循环。由2x=n 得到x=logzn.所以这个循环的时间复杂度为o(logn).
4.平方阶
下面例子是一个循环嵌套,它的内循环刚才我们已经分析过,时间复杂度为o(n).
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{/*时间复杂度为0(1)的程序步骤序列*/
}
}
而对于外层的循环,不过是内部这个时间复杂度为0(n)的语句,再循环n次。所
以这段代码的时间复杂度为0[n^2].
常用的时间复杂度所耗费的时间从小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2^n)<O(n! )<O(n^n)