一般从以下维度来评估算法的优劣
- 正确性、可读性、健壮性(对不合理输入的反应能力和处理能力)
- 时间复杂度 (time complexity ):估算程序指令的执行次数(执行时间)
- 空间复杂度 (space complexity ):估算所需占用的存储空间
一般用大O表示法来描述复杂度 ,它表示的是数据规模 n 对应的复杂度。
计算出一个程序的时间复杂度后,也就是它执行的次数,然后将常数,系数,低阶都忽略,剩下的就是它的大O表示法的时间复杂度。
- 9 O(1)
- 2n + 3 O(n)
- n^2 + 2n + 6 O(n^2)
- 4n^3 + 3n^2 + 22n + 100 O(n^3)
其中要注意对数的计算,因为对数符合下面的公式:
log2(n) = log2(9)∗ log9(n)
一个以 2 为底 n 的对数可以转换成 以 2 为底 m 的对数 乘以 以 m 为底 n 的对数(m 是一个常数),因此,上面例子中 log2(9) 是常数可以省略,而底可以互相转换,所以对数在大O表示法中将底数省略,一律表示成 O(log(n))。
执行次数 | 复杂度 | 非正式术语 |
---|---|---|
12 | O(1) | 常数阶 |
2n + 3 | O(n) | 线性阶 |
4n^2 + 2n + 6 | O(n^2) | 平方阶 |
4log2(n) + 25 | O(log(n)) | 对数阶 |
3n + 2nlog3(n) + 15 | O(nlog(n)) | nlogn阶 |
4n^3 + 3n^2 + 22n + 100 | O(n^3) | 立方阶 |
2^n | O(2^n) | 指数阶 |
O(1) < O(log(n)) < O(n) < O(nlog(n)) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)