算法和算法分析
算法的定义和特性
算法:是能为了解决某类问题而规定的一个有限长的操作序列。
一个算法必须满足以下五个重要特性:
- 有穷性: 一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
- 确定性: 对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。
- 可行性: 算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
- 输入: 一个算法有零个或多个输入。
- 输出: 一个算法有一个或多个输出。
评价算法优劣的基本标准
- 正确性: 在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
- 可读性: 便于人们的理解交流。
- 健壮性: 当输入的数据非法时,能适当做出正确反应或进行相应处理。
- 高效性: 包括时间和空间两个方面。时间高效指算法设计合理,执行效率高,用时间复杂度来度量;空间高效指算法占用存储容量合理,用空间复杂度来度量。
算法的时间复杂度
- 问题规模和语句频度
问题规模:算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。n越大算法的执行时间越长。
语句规模:一条语句的重复执行次数。
例:
语句int num1,num2;的频度为1;
语句i=0;的频度为1;
语句i<n; i++; num1+=1; j=1; 的频度为n;
语句j<=n;j=2; num2+=num1;的频度为nn;
T(n) = 2 + 4n +3nn
- 算法的时间复杂度的定义
算法的时间复杂度通常用大O符号表述,定义为T[n] = O(f(n))。称函数T(n)以f(n)为界或者称T(n)受限于f(n)。 如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n)。T(n)称为这一算法的“时间复杂度”。当输入量n逐渐加大时,时间复杂度的极限情形称为算法的“渐近时间复杂度”。
常量阶 T(n)=O(1)
{x++;
y=0;}
这两条语句频道均为1,算法的执行时间是一个与问题规模n无关的常数。如果算法的执行时间不随问题规模n的增长而增长,算法中语句频度就是某个常数。
线性阶 T(n)=O(n)
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++;
对循环语句只需考虑循环体中语句的执行次数,以上程序段中频度最大的语句是6,其频度为f(n)=O(n²)。
立方阶 T(n)=O(n)
1. x=1;
2. for(i=1;i<=n;i++)
3. for(j=1;j<=n;j++)
4. for(k=1;k<=n;k++)
5. x++;
该程序段中频度最大的语句是5,这条最深层循环内的基本语句的频度,依赖于各层循环变量的取值,其频度为f(n)=O(n3)。
对数阶 T(n)=O(㏒n)
for(i=1;i<=n;i++)
{
x++;
s=0;
}
设循环体内两条基本语句的频度为f(n),则有2f(n)<=n,f(n)<=㏒2n。
- 最好、最坏和平均时间复杂度
最好时间复杂度:最好情况下的时间复杂度,指的是算法计算量可能达到的最小值。
最坏时间复杂度:最坏情况下的时间复杂度,指的是算法计算量可能达到的最大值。
平均时间复杂度:指算法在所有可能情况下,按照输入实例以等概率出现时,算法计算量的加权平均值。