算法-时间复杂度和空间复杂度
Big O notation 时间复杂度
因为时间复杂度和空间复杂度具体可以代表代码所用的运行时间以及占用的运行空间,所以认真了解并观测自己写的代码的时间/空间复杂度是很有必要的,可以让我们找到自己所写代码中更优质的代码。
注意:在相关复杂度的计算中,我们只看最高复杂度的运算,前面的常数系数会忽略
O(1)
Constant Complexity 常数复杂度
O(log n)
Logaruthmic Complexity 对数复杂度
O(n)
Linear Complexity 线性时间复杂度
O(n^2)
N square Complexity 平方
O(n^3)
N square Complexity 立方
O(2^n)
Exponential Growth 指数
O(n!)
Factorials 阶乘
递归的时间复杂度
方法:把递归它的执行顺序画出一个树型结构,称其为:递归状态的递归树(简称:状态树)
以Fibonacci数列求n项为例:
F(n) = F(n-1)+F(n-2)
Fib: 0,1,1,2,3,5,8,13,21...
int fib(int n){
if(n<=2) return n;
return fib(n-1) + fib(n-2);
}
以F(4)为例:
而主定理就是用来提供一个给所有递归函数计算时间复杂度的方法
Master Theorem 主定理
Master Theorem 主定理是可以解决所有递归函数的时间复杂度的计算。
主要用到的有四个应用场景:
1)Binary search 二分查找(一般发生在一个数列本身有序的时候,要在有序的数列里找到自己所有的目标数,每次都一分为二,只查一边),其时间复杂度为:O(log n)
2)Binary tree traversal 二叉树的遍历,每个节点都需要访问一次,并且仅访问一次,其时间复杂度为:O(n)
3)Optimal sorted matrix search 有序的二维矩阵中进行二分查找,其时间复杂度为:O(n)
4)Merge sort 归并排序,其时间复杂度为:O(nlog n)
前提是有序的情况下,一维数组中二分查找O(log n),二维矩阵中二分查找O(n)
时间复杂度相关的典型问题
1.二叉树遍历,其前序、中序、后序的时间复杂度分别为多少?
因为遍历二叉树,无论是采用哪种顺序进行访问,都是需要对每个节点会访问一次且仅访问一次,所以其时间复杂度都为O(n),其中n为二叉树的节点总数
2.图的遍历的时间复杂度是多少?
因为遍历图,是需要对图里面的每个节点会访问一次且仅访问一次,所以其时间复杂度为O(n),其中n为图里面的节点总数
3.搜索算法DFS、BFS的时间复杂度为?
因为搜索算法,是需要对每个节点会访问一次且仅访问一次,所以其时间复杂度为O(n),其中n为搜索空间里面的节点总数
4.二分查找的时间复杂度为?
O(log n)
一般没有特意指出是二维矩阵,便是默认为一维数组中的二分查找