算法时间复杂度定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
//简称为大O记法。
注:一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。
大O记法的推断:
(1)用常数1取代运行时间中的所有加法常数。
(2)在修改后的运行次数函数中,只保留最高阶项。
(3)如果最高阶项存在且不是1,则除去与这个项相乘的常数。得到的结果就是大O阶。
常用的时间复杂度所消耗的时间从小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(nn)<O(nn*n)<O(2n)<O(n!)<O(nn)
一:常数阶O(1)
int sum = 0, n = 100;
sum = (1 + n)*n / 2;
printf("%d\n", sum);
//高斯算法
这里代码有三行,但是时间复杂度是O(3),而不是O(1),这是根据大O记法推断出来的,第一步就是让一替换三。
二:线性阶
int i=0; //1
for(i =0 ;i<n;i++)//n+1
{
/* 时间复杂度为O(1)的程序步骤序列*/ //n
}
根据大O记法的推断,时间复杂度为O(n)
三:对数阶
int count=1;
while(count<n)
{
count=count*2;
//时间复杂度为O(1)的程序步骤序列
}
由于每次count乘以2后,距离n更近了,即2x=n,得到x=log2n,所以时间复杂度为O(logn)
四:平方阶
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
//时间复杂度为O(1)的程序步骤序列
}
}
int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
//时间复杂度为O(1)的程序步骤序列
}
}
对于函数调用方面的时间复杂度
int i,j;
for(i=0;i<n;i++)
{
function(i);
}
void function(int count)
{
printf("%d\n",count);
}
//function函数的时间复杂度是O(1),所以整体的时间复杂度是O(n),根据大O记法的推断j即可得出。
//推导出时间复杂度需要一些数学知识。