算法效率从以下两个方面考虑:
- 时间效率:指的是算法所耗费的时间
- 空间效率:指的是算法执行过程中所耗费的存储空间
时间 效率和空间效率有时候是矛盾的。
在这里我们只讨论事前分析法,因为事后分析法也和计算机的软硬件等其他客观条件有关。
事前分析法
一个算法的运行时间大致等于计算机执行一种简单操作(如赋值,比较,移动等)所需的时间与算法中进行的简单操作的次数的乘积。
以矩阵为例:
for(i=1;i<=n;i++) //n+1次
for(j=1;j<=n;j++) //n*(n+1)次
{
c[i][j]=0; //n*n次
for(k=0;k<=n;k++) //n*n*(n+1)次
c[i][j]=c[i][j]+a[i][k]*b[k][j];//n*n*n次
}
那么上述算法所消耗的时间是该算法中每条语句的执行次数之和,则消耗的时间T(n)=2n3 +3n2 +2n+1。
为了便于比较不同算法的时间效率,我们仅比较他们的数量级。
- 若某个辅助函数f(n)(即只包含最高数量级的函数),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为时间复杂度。
分析算法时间复杂度的方法:
- 找出语句频度最大(即算法执行次数最多)的那条语句作为基本语句
- 计算基本语句的频度得到的问题规模n的某个函数f(n)
- 取其最高数量级的用符号O表示
时间复杂度是由嵌套最深层语句的频度决定的。
例:
void exam(float x[][],int m,int n)
{
float sum[];
for(int i=0;i<m;i++)
{
sum[i]=0.0;
for(int j=0;j<n;j++)
sum[i]+=x[i][j];//嵌套最深层
}
例题:
i=1;
while(i<=n)
i=i*2;
设执行次数为x
2x <=n
x<=log2n
则执行次数最大为log2n ,T(n)=O(log2n )
来源:CSDN
作者:柳叶lhy
链接:https://blog.csdn.net/lhyhaiyan/article/details/104564074