算法复杂度分为空间复杂度和时间复杂度;
-
概念
空间复杂度:是执行这个算法所需的内存空间;
时间复杂度:是运行这个算法所需的时间;
一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
-
时间复杂度的计算
时间复杂度常用大O表示法表述,即计算时不包括这个函数的常数项和首项系数。
T(n)=O(f(n))
f (n) 表示每行代码执行次数之和
常见的时间复杂度量级有:
常数阶O(1)
数阶O(logN)
线性阶O(n)
线性对数阶O(nlogN)
平方阶O(n²)
立方阶O(n³)
次方阶O(n^k)
指数阶(2^n)
O(1) < O(logn)< O(n) < O(nlogn) < O(n²) < O(n³) < O(2^n) < O(n!) < O(nn)
(1)在一层循环中
思路:1.列出循环趟数 t 及每轮循环的变化值
2.找到 t 与 i 的关系
3.确定循环停止条件
4.联立两式 解方程
5.计算结果
例:
i=n*n;
while(n!=1)
i=i/2;
按照解题思路 列出 t=0时 i=n*n; t=1时 i=n*n/2; t=2时 i=n*n/4; t=3时 i=n*n/8;
t=4时 i=n*n/16; t=5时 i=n*n/32; ............................
以此类推得 i=n*n/2^t (a);
i=1 (b);
联立(a) (b) T=O(log2N);
(2)在两层循环中
思路:1.列出外层循环 i 的变化值
2.列出内层语句的执行次数
3.求和 写结果
例:
int m=0,i,j;
for(i=1;i<=n;i++)
for(j=1;j<=2*i;j++)
m++;
按解题思路 列出外层循环 i 的变化 i=1; i=2; i=3...........
内存语句随 i 变化执行次数 2次 4次 6次..........
等差数列求和 n*(2+2*n)/2=n*(n+1)
f(n)=n*(n+1);
大O表示法省略常数项得 T=O(n*n);
(3)多层循环
思路:方法 1. 抽象为计算三维体积
方法 2. 列式求和