时间复杂度
先给出一小段代码:
void su(int x)
{
int i = 0;//(1)执行语句一
for (; i < n; i++)//(2)执行语句二
{
x++;//(3)执行语句三
printf("hanpizhougaohao");//(4)执行语句四
}
}
根据我们所学可以得出该函数:
(1)运行1次
(2)运行n次(i++)
(3)运行n次
(4)运行n次
现在我们给出一个概念:
时间频度:一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。
这里的时间频度即为:T(n)=(1)+(2)+(3)+(4)=3*n+1;
现在我们再多给出几条时间频度:
T1(n)=n³+n2+1
T2(n)=n4+n³+1000;
如果我们的n=1000,那么我们的
T(1000)=3000+1=3001
T1(1000)=1001000001
T2(1000)=1001000001000
由上我们不难看出:不在一个数量级时,低阶部分和小常数对整个程序的时间影响可以说是微乎其微的。
所以我们有结论:可以只考虑高阶部分和省略系数(注意因为是在计算机之中,速度非常之快,所以3000和1000也区别不大)。
由此我们提出一个表示法:
大O表示法:大O表示同阶,同等数量级。
由此
T(n)=O(n)
T1(n)=O1(n³)
T2(n)=O(n4)
时间复杂度:一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
常见的时间复杂度比较有:
O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)