时空复杂度
时空复杂度
算法效率:
-
时间效率:程序在计算机上执行所消耗的时间
-
事后统计
- 缺:编写程序实现算法要花费较多时间精力;所得实验结果依赖于计算机的软硬件等环境因素,掩盖算法分身的优劣
-
事前分析:估算;算法运行时间=一个简单操作所需的时间*简单操作次数(转化为语句频度的比较)
例:
-
1 for(i=1;i<=n;i++) // n+1次,虽然不满足条件但也执行一次
2 for(j=1;j<=n;j++){ // n(n+1)次
3 c[i][j]=0; //n*n次
4 for(k=0;k<n;k++) //n*n*(n+1)次
5 c[i][j]=c[i][j]+a[i][k]*b[k][j]; // n*n*n次
6 }
-
T(n)=2n^3+ 3n^2+2n +1=时间复杂度O(n^3)(为了便于比较仅比较数量级)
T(n)=O(f(n));O(f(n))(O是数量级的符号)为算法的渐进时间复杂度, 简称时间复杂度
步骤:
- 找出语句频度最大的那条语句作为基本语句
- 计算基本语句的频度得到问题规模n的某个函数f(n)
- 取其数量级将用O表示
例:
for( i=1; i<=n; i++)
for (j=1; j<=i; j++)
for (k=1; k<=j; k++)
x=x+1;语句频度=n(n+1)(n+2)/6
![image]()
T(n)=O(n^3)
例:
i=1;
while(i<=n)
i=i*2;
T(n)=O(log2 n)
有的情况下基本重复执行次数还随问题的输入数据不同而不同
例:顺序查找,在数组a[i]中查找值为e的元素,返回其所在位置
最好的情况:1次;最差的情况:n次;平均时间复杂度:O(n)
所以,一般考虑的是最差情况下的时间复杂度,以保证算法的运行时间不会更长
复杂度低->高
常数阶 对数阶 线性阶 线性对数阶 平方阶 立方阶 ... K次方阶 指数阶 O(1) O(log2 n) O(n) O(nlog2 n) O(n^2) O(n^3) O(n^K) O(2^n)
-
空间效率:算法所需存储空间的度量 S(n)=O(f(n))
算法占据的空间:
- 算法本身要占据的空间:输入/输出、指令、常数、变量等
- 算法要使用的辅助空间
例:将一维数组a中的n个数逆序存放到原数组中
for(i=0;i<n/2;i++){
t=a[i]; a[i]=a[n-i-1];
a[n-i-1]=t;
}
变量为t,其空间复杂度S(n)=O(1)
for(i=o;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i];
变量为b[i],其空间复杂度S(n)=O(n)
时间效率空间效率有时候是矛盾的
程序是用某种程序设计语言对算法的具体实现

浙公网安备 33010602011771号