一、算法分析
分析时间复杂度和空间复杂度
1.1算法执行时间相关因素
1.算法选用的策略
2.问题的规模
3.编写程序的语言
4.编译程序产生的机器代码的质量
5.计算机执行指令的速度
1.2如何估算算法的时间复杂度
算法的时间复杂度取决于问题的规模和待处理数据的初态
1.2.1基本概念
1.基本语句:基本语句是执行次数与整个算法的执行次数成正比的语句,基本语句对算法运行时的贡献最大
2.语句频度:语句重复执行的次数
3.一个算法中所有语句频度之和构成了该算法的运行时间
例如: for(j=1;j<=n;++j)
for(k=1;k<=n;++k)
++x;
语句“++x、k<=n、++k”的频度是n2,
语句“ j=1”的频度是1,
语句“j<=n;++j 、k=1”的频度是n。
算法运行时间为:3*n2+3n+1
1.2.2区分
1.运行时间不是时间复杂度
2.一个算法中的语句执行次数称为语句频度或时间频度,表示为T(n),n表示问题的规模
3.时间复杂度就是时间频度去掉低阶项和首项常数。
比如某个算法的时间频度时T(n)=10000nn+10n+3
但是时间复杂度时T(n)=O(nn)
1.2.3算法实例分析
非递归算法分析
1.仅依赖于“问题规模”的时间复杂度
例1:交换i和j的内容。
Temp = i; i = j; j = Temp;
T(n)=O(1);
执行时间不随着算法规模n的增长而增大,只是一个常数
2.变量计数之一。
(1) x=0;y=0;
(2) for(k=1; k<=n; k++)
(3) x++;
(4) for(i=1; i<=n; i++)
(5) for(j=1; j<=n; j++)
(6) y++;
该算法段的时间复杂度为T(n)=O(n2)。
结论:当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。
3.变量计数之二。
(1) x=1;
(2) for(i=1; i<=n; i++)
(3) for(j=1 ; j<=i; j++)
(4) for(k=1; k<=j; k++)
(5) x++;
该算法频度最大语句是5,按5计算复杂度
O(n^3)
4.算法的平均复杂度是对T(n,k)的加权平均值
递归算法分析
1.猜测技术
2.扩展递归技术
递归方程为:T(n)=T(n-1)+O(1),其中O(1)为一次乘法操作。
迭代求解过程如下:
T(n)=T(n-2)+O(1)+O(1)
=T(n-3)+O(1)+O(1)+O(1)
……
=O(1)+……+O(1)+O(1)+O(1)
=n*O(1)
=O(n)
3.通用分治递推式
常见关系
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
O(2n)<O(n!)<O(nn)