基础储备
算法复杂度分析
算法复杂度可以分为时间复杂度和空间复杂度,这里我跳过一些比较基础的分析,基础可以参考:算法的时间复杂度和空间复杂度-总结
我们主要来分析递归式的复杂度。
时间复杂度
时间复杂度其实并不是表示一个程序解决问题具体需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。
引入一个解决递归问题时间复杂度的最常用的方法:主方法
总结一下过程就是:
- 确定a,b的值
- 求出 n l o g b a n^{log_{b} a} nlogba,与 f ( n ) f(n) f(n)比较,取数量级大的那个。如果相等,乘一个 l o g n log n logn
空间复杂度
以Fibonanci number为例子,分析空间复杂度。
def fib(n):
if n<3:
return 1
return fib(n-2)+fib(n-1)
占用内存空间的两种情况:变量和函数。变量就不在赘述,函数主要占用内存空间是通过栈(stack),即函数压栈。
递归计算Fibonanci number时,函数不断入栈出栈,最多情况下只会用到n个栈空间,所以空间复杂度为
O
(
n
)
O(n)
O(n).
参考:斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
动态规划
可以参考我的另一篇博文:(算法理论)动态规划(python)
P and NP and NP Hard and NP Complete
定义如下:
P问题:
一个问题可以在多项式(O(n^k))的时间复杂度内解决。
NP问题:
一个问题的解可以在多项式的时间内被验证。NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。
NP-hard问题:
任意NP问题都可以在多项式时间内归约为该问题,但该问题本身不一定是NP问题。归约的意思是为了解决问题A,先将问题A归约为另一个问题B,解决问题B同时也间接解决了问题A。
NPC(NP Complete)问题:
既是NP问题,也是NP-hard问题。
一篇文章特别不错:NP问题真的很难理解