算法分析
- CPU时间–>时间性能分析
- 内存空间–>空间性能分析
目的:分析算法的时空效率以便改进算法性能
算法分析方式:
事后统计法:编写相对应程序,统计其执行时间
事前统计法:撇开上述因素,认为算法的执行时间是问题规模n的函数
算法时间复杂度分析
一个算法是控制结构(顺序、分支、循环三种)和原操作(指固有数据类型的操作,比如++、--、*、/、+、-等)构成的。
在以下算法中,语句1、3、5、6就是原操作:void fun(int a[],int n)
{
int i; //1
for(i=0;i<n;i++) //2
a[i]=2*i; //3
for(i=0;i<n;i++) //4
printf("%d",a[i]); //5
printf("\n"); //6
}
算法执行时间取决于两者的综合效果。执行原操作越多,执行时间ue就相对越多,否则反之
一个算法的基本构成:分析算法的执行时间
求出算法所有原操作的执行次数(也称为频道),它是问题规模n的函数,用T(n)表示。
问题规模:用于解决问题大小的正整数,如n给记录排序
算法的执行时间大致=原操作所需的时间*T(n)。
所以 T(n)与算法的执行时间成正比为此用T(n)表示算法执行时间。比较不同算法的T(n)大小得出算法执行时间的好坏。
算法的执行时间用时间复杂度来表示
算法中执行时间T(n)是问题规模n的某个函数f(n),记作: T(n)=O(f(n))"O"读做“大O”,它表示随问题规模n的增大算法执行时间的增长率和f(n)的增长率相同。
“O”的形式定义为: T(n)=O(f(n))表示在一个正的常数M,使得当n>=n0时都满足: |T(n)|<=M|f(n)|f(n)是T(n)的上界这种上界有很多可能,通常取最接近的上界,即紧凑上界
- 一个没有循环的算法执行时间与问题规模n无关,记作O(1),也称常数阶
- 一个只有一重循环的算法的执行时间与问题规模n的增长呈线性增大关系,记作O(n),也称为线性阶
- 其余常用的算法时间复杂度还有平方阶O(n²)、立方阶O(n³)、对数阶O(log₂n)、指数阶O(2的n次方)等
O(1)<O(log₂n)<O(n)<O(nlog₂n)<O(n²)<O(n³)<O(2的n次方)<O(n!)
- 多项式阶 P问题:O(1)、O(log₂n)、O(n)、O(nlog₂n)、O(n²)、O(n³)
- 指数阶 NP问题:O(2的n次方)、O(n!)
算法时间性能比较:
假如求同一问题有两个算法:A和B,如果算法A的平均时间复杂度为O(n),而算法B的平均时间复杂度为O(n²)。 一般情况下,认为算法A的时间性能好于算法B简化的算法时间复杂度分析
算法的基本操作一般是最深层循环内的原操作。
算法执行时间大致=基本操作所需的时间*其运算次数,在算法分析是,计算T(n)时仅仅考虑基本操作的运算次数。算法空间复杂度分析
空间复杂度:比较不同算法的T(n)大小得出算法执行时间的好坏。
一般也作为问题规模n的函数,采用数量级形式描述S(n)=O(g(n))
若一个算法的空间复杂度为O(1),则称此算法为原地工作或就地工作算法。其他情况的算法分析
最好、最坏和平均时间复杂度分析- 平均时间复杂度: A(n)=P(I)*T(I)
- 最坏时间复杂度:W(n)=MAX{T(I)}
- 最好时间复杂度:S(n)=MIN{T(I)}
递归算法的时空复杂度分析
递归算法是指算法中出现调用自己的成分- 递归算法分析也称为变长时空分析
- 非递归算法分析也称为定长时空分析