数据结构与算法基础------计算时间复杂度与空间复杂度
2020-03-08 11:42
615 查看
算法效率从以下两个方面考虑:
- 时间效率:指的是算法所耗费的时间
- 空间效率:指的是算法执行过程中所耗费的存储空间
时间 效率和空间效率有时候是矛盾的。
一、时间复杂度
在这里我们只讨论事前分析法,因为事后分析法也和计算机的软硬件等其他客观条件有关。
事前分析法
一个算法的运行时间大致等于计算机执行一种简单操作(如赋值,比较,移动等)所需的时间与算法中进行的简单操作的次数的乘积。
以矩阵为例:
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 )
请注意: 有的情况下,算法中基本操作的执行次数还随问题的输入数据集的不同而不同。
for(i=0;i<n;i++) if(a[i]==e) return i+1;//找到,并且返回是第几个元素 return 0;
最好的情况:查找1次,即a[0]==e
最坏的情况:查找n次,即a[n-1]==e或数组中的数都不等于e
平均时间复杂度:n/2(a[i]等于e或不等于e的概率各是1/2,总共执行n次,所有是n/2)
(平均时间复杂度指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。)
一般总是考虑最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
时间复杂度T(n)按数量级递增的顺序为:
二、空间复杂度
算法占据的存储空间:
- 算法本身要占据的存储空间,输入/输出,指令,变量等
- 算法要使用的辅助函数
举个例子:
将一维数组a中的n个数逆序存放到原数组中。
//【算法一】 for(i=0;i<n;i++) { t=a[i]; //这里只引入一个辅助变量t a[i]=a[n-i-1]; a[n-i-1]=t; }
T(n)=O(1)
//【算法二】 for(i=0;i<n;i++) { b[i]=a[n-i-1];//这里引入一个和a大小相等的辅助数组b } for(i=0;i<n;i++) a[i]=b[i];
T(n)=O(n)
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 视频序列的空间复杂度和时间复杂度的不用模型计算
- 计算时间和空间复杂度
- 算法时间复杂度和空间复杂度计算
- 关于时间复杂度和空间复杂度的计算
- 算法的时间复杂度和空间复杂度计算
- 关于计算时间复杂度和空间复杂度
- 计算时间和空间复杂度
- 计算时间复杂度与空间复杂度
- 计算时间复杂度和空间复杂度的方法
- 浅谈时间复杂度及空间复杂度的计算。
- 关于计算时间复杂度和空间复杂度
- 算法的复杂度包括时间复杂度和空间复杂度分别如何计算?
- 【C/C++】空间复杂度和时间复杂度的计算
- 计算时间复杂度&空间复杂度
- 常用排序算法的时间和空间复杂度及算法时间复杂度的简单计算
- Topic Model 的复杂度计算(时间和空间)
- 0-时间复杂度&空间复杂度的计算
- 数据结构2:算法时间复杂度和空间复杂度的计算
- 计算时间复杂度和空间复杂度
- 如何计算一个算法的时间复杂度和空间复杂度