1、时间频度的基本概念:
时间频度:一个算法的花费的时间与算法的语句的执行次数成正比。一个算法执行次数越多,花费的时间越多。
一个算法中的语句执行次数称为语句频度或时间频度,记作:T(n)。
举例说明:
计算1+2+3+。。。+100,
代码1:
int total=0;
int end=100;
for(int i=1;i<100;i++){
total=total+i;
}
T(n)=n+1;
加1是因为最后n=100了,但是n=100后还要再进行1次判断。
//直接计算
total=(1+end)*end/2;
T(n)=1;
三大原则:
1)忽略常数项:
T(n)=2n+10和T(n)=2n随着n的增大,执行曲线不断增大。
2)忽略低次项
T(n)=2n^2+3n+10 和T(n)=2n^2 随着n的增大,执行曲线无线接近。
3)忽略系数
T(n)=3n^2+2n 与 T(n)=5n^2+7n 随着n的增大,执行曲线无线接近。
2、时间复杂度
1)一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当
T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称算法的渐进时间复杂度,简称时间复杂度。
2)计算时间复杂度的方法:
《1》用常数1来代替运行时间中的所有加法常数 T(n)=n^2+7n+6-------T(n)=n^2+7n+1
《2》修改后的运行次数函数中,只保留最高阶项 T(n)=n^2+7n+1------T(n)=n^2
《3》去除最高阶项的系数 T(n)=n^2-----T(n)=n^2----O(n^2)
3、常见的时间复杂度
1)常数阶O(1) 时间复杂度最小
2) 对数阶O(log2N) 2为底数,N为真数
3) 线性阶 O(n)
4) 线性对数阶O(nlog2N) 2为底数,N为真数
5) 平方阶O(n^2)
6) 立方阶O(n^3)
7) K次方阶O(n^k)
8) 指数阶O(2^n)
上述,从1)---到8,时间复杂度不断增大,算法的执行效率越来越低
1)常数阶O(1)
无论执行多少行代码,只要没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)
代码例子:
int i=0;
int j=0;
i++;
j++;
int h=i+j;
2 )对数阶O(log2N) 2为底数,N为真数
int i=1;
while(i<n){
i=i*2;}
说明:在循环体内,i每次乘以2,i离n越来越近,假设循环X次数后,i就大于n了,退出循环,也就2的X次方为n,那么x=log2N
3)线性阶 O(n)
单层的for循环。
int total=0;
int end=100;
for(int i=1;i<100;i++){
total=total+i;
}
说明:for循环里,代码执行n遍,因此他消耗的时间是随着n的变化而变化。
时间频度为T(n)=n+1,时间复杂度为O(n)
4)线性对数阶O(nlog2N)
for(int i=0;i<n;i++){
i=1;
while(i<n){
i=i*2;
}
}
说明:将时间复杂度为O(log2N)的外面加一个for循环,时间复杂度就是线性对数阶O(nlog2N)
5)平方阶O(n^2)
两层for循环
6)立方阶O(n^3)
三层for循环
平均时间复杂度:
所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。
最坏情况下的时间复杂度:
最坏时间复杂度-------一般讨论的时间复杂度就是最坏时间复杂度。