为什么需要复杂度分析?
事后统计法:
- 测试结果非常依赖测试环境
- 测试结果受数据规模的影响很大
大 O 复杂度表示法
所有代码的执行时间 T(n) 与每行代码的执行次数 f(n) 成正比。

渐进时间复杂度(asymptotic time complexity),简称时间复杂度
时间复杂度分析
- 只关注循环执行次数最多的一段代码
int cal(int n) {int sum = 0;int i = 1;for (; i <= n; ++i) {sum = sum + i;}return sum;}
- 加法法则:总复杂度等于量级最大的那段代码的复杂度
int cal(int n) {int sum_1 = 0;int p = 1;for (; p < 100; ++p) {sum_1 = sum_1 + p;}int sum_2 = 0;int q = 1;for (; q < n; ++q) {sum_2 = sum_2 + q;}int sum_3 = 0;int i = 1;int j = 1;for (; i <= n; ++i) {j = 1;for (; j <= n; ++j) {sum_3 = sum_3 + i * j;}}return sum_1 + sum_2 + sum_3;}
- 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
int cal(int n) {int ret = 0;int i = 1;for (; i < n; ++i) {ret = ret + f(i);}}int f(int n) {int sum = 0;int i = 1;for (; i < n; ++i) {sum = sum + i;}return sum;}
几种常见时间复杂度实例分析

O(1)
int i = 8;int j = 6;int sum = i + j;
O(logn)、O(nlogn)
i=1;while (i <= n) {i = i * 2;}

i=1;while (i <= n) {i = i * 3;}
O(m+n)、O(m*n)
int cal(int m, int n) {int sum_1 = 0;int i = 1;for (; i < m; ++i) {sum_1 = sum_1 + i;}int sum_2 = 0;int j = 1;for (; j < n; ++j) {sum_2 = sum_2 + j;}return sum_1 + sum_2;}
空间复杂度分析
渐进空间复杂度(asymptotic space complexity),表示算法的存储空间与数据规模之间的增长关系
void print(int n) {int i = 0;int[] a = new int[n]; // O(n)for (i; i <n; ++i) {a[i] = i * i;}for (i = n-1; i >= 0; --i) {print out a[i]}}
内容小结

