-
什么是大O:
-
n表示数据规模,O(f(n))表示运行算法所需要执行的指令数,和f(n)成正比,比如:
- 二分查找法O(logn),所需执行指令数: a*logn
- 寻找数组中的最大/最小值O(n),所需执行指令数: b*n
- 归并排序算法O(nlogn),所需指令数: c*nlogn
- 选择排序法O(n2),所需指令数: d*n2
-
对邻接表实现的图进行遍历:时间复杂度: O(V +E ),即访问所有的顶点和所有的边。
-
举例:有一个字符串数组,将数组中的每一个字符串按照字母序排序;之后再将整个字符串数组按照字典序排序。整个操作的时间复杂度是多少?
- 错误答案:O( n*nlogn + nlogn ) = O(n2logn),错误原因:字符串的长度和数组的长度不是一个变量,
- 正确答案:O(n*slog(s)) + O(s*nlog(n)) = O( n*s*logs + s*n*logn)= O( n*s*(logs+logn) )
- 假设最长的字符串长度为s,数组中有n个字符串
- 对每个字符串排序: O(slogs)
- 将数组中的每一个字符串按照字母序排序: O(n*slog(s))
- 将整个字符串数组按照字典序排序: O(s*nlog(n))
-
数据规模的概念,如要想在1s之内解决问题:
- O(n2)的算法可以处理大约104级别的数据;
- O(n)的算法可以处理大约108级别的数据;
- O(nlogn)的算法可以处理大约107级别的数据;
-
空间复杂度:
- 多开一个辅助的数组:O(n);
- 多开一个辅助的二维数组:O(n2);
- 多开常数空间:O(1);
- 递归调用有空间代价,递归的深度就是空间复杂度;
-
常见的时间复杂度:
- 交换两数:O(1);
- 数列求和:O(n);
- 选择排序:O(n2);
- 二分查找:O(logn);
-
递归中进行一次递归调用的复杂度分析:如果递归函数中,只进行一次递归调用,递归深度为depth;在每个递归函数中,时间复杂度为T;则总体的时间复杂度为O( T * depth )。
-
递归中进行多次递归调用的复杂度分析:如果计算成倍扩大,复杂度是2n级别,如果使用分治法,复杂度减少到了O(n*logn)级别。