定义:
在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
我们都知道,一个算法的执行时间大致上等与其所有语句执行时间的总和,而语句的执行时间则为该条语句的重复执行次数合执行一次所需时间的乘积。
PS:一条语句的重复执行次数称作语句频度。
OK,既然知道这些理论知识,我们直接切入正题。课本上给出了一条计算时间复杂度的定理:
若f(n)=amnm+am-1nm-1+…+a1n+a0是一个m次多项式,则T(n)=O(nm)
这条定理说明计算时间复杂度时,可以忽略所有低次幂项合最高次幂的系数(我们称之为简化法)。
举个栗子:
for(i=1;i<=n;i++) //频度为n+1
{
for(j=1;j<=n;j++) //频度为n*(n+1)
{
c[i][j]=0; //频度为n^2
for(k=1;k<=n;k++) //频度为n^2*(n+1)
c[i][j]=0; //频度为n^3
}
}
上面是一个经典的时间复杂度的计算,这段程序连用了3个for循环,然而实际计算的时候并不需要这么麻烦,我们直接找到最内层循环的循环体,也就是c[i][j]=0,每个for循环都当作频度为n,三层循环就是n3,即最终答案。
通过上述例题我们总结一下计算的基本步骤;
1)找到最后执行的语句
2)计算该语句的频度
3)取最高次幂项,去除系数
4)得到答案
在实际计算的时候,并不需要死扣每条语句的频度,比如for语句频度看作n,我们要找到一种“差不多”的感觉,而这种感觉得到的答案往往就是正确答案。
下面是一些常见时间复杂度的总结:
1)常量阶:
{x++; s=0;} //T(n)=O(1)
for(i=0;i<n;i++) //T(n)=O(1)
{
x++;
s=0;
}
2)线性阶:
for(i=0;i<n;i++) //T(n)=O(n)
{
x++;
s=0;
}
3)平方阶:
x=0;y=0;
for(k=1;k<=n;k++)
x++;
for(i=1;i<=n;i++) //T(n)=O(n^2)
{
for(j=1;j<=n;i++)
y++;
}
4)立方阶:
x=1;
for(i=1;i<=n;i++) //T(n)=O(n^3)
{
for(j=1;j<=n;i++)
{
for(k=1;k<=n;k++)
x++;
}
}
5)对数阶:(比较特殊,但有规律可循,看循环条件i,令2^x=n,解得x=log2n)
for(i=1;i<=n;i=i*2) //T(n)=O(log2n)
{
x++;
s=0;
}
别着急走,我再安利一篇文章,写得很nice!!!