算法导论(MIT 6.006 第19讲)算法
1: 定义子问题spa
计算子问题的数量
2:猜想(尝试全部可能的方式,获取最好的)code
计算选择的数量
3: 关联全部的子问题排序
计算单个子问题所须要处理的时间
4: 重用子问题结果并记下新的结果,或者使用DP的bottom-up方式(须要注意没有环)递归
计算总耗时
5: 解决原有的问题图片
对结果进行组合等等会划掉部分额外的时间总的来讲就是:尝试全部可能的子问题的结果,将最好的可能子结果存储下来,而后重复利用已经解决的子问题,递归去解决全部的问题(猜想+记忆+递归)it
它消耗的时间为: 子问题的数量 * 每一个子问题处理所须要时间
fib(n): if n<=2:f=1; else: f= fib(n-1)+fib(n-2); return f;
这种方式的运行时间为 $\theta$($2^{n/2}$),空间为O(1)table
T(n)=T(n-1)+T(n-2)+O(1) $\geq$ 2T(n-2)= $\theta$($2^{n/2}$)
fib(n): memo={} if n in memo:return memo[n]; if n<=2:f=1; else f=fib(n-1)+fib(n-2); memo[n]=f; return f;
这种方式的运行时间为$\theta(n)$,空间为O(n)class
memo的存在使得实际产生调用的只有 fib(1) .... fib(n),共n次,区域的直接从memo中获取,使用常量的时间
fib(n): fib={} for i in range(1,n+1): if i<=2: f=1 else: f=fib[i-1]+fib[i-2] fib[i]=f return fib[n]
这种方式的运行时间为$\theta(n)$,空间能够只用O(1)循环
它能够看作是一种拓扑排序(针对DAG),对于使用空间其实只须要记住前两个便可
![]()
要求s到t的最短路径,那么一定会通过与t相邻的一条边,如图示的u,那么最短路径$\delta(s,t)$=$min_{(u,t)\in E}(\delta(s,u)+w(u,t))$
$\delta(s,u)$就是须要递归调用处理的部分
对于DAG:$\delta(s,t)$每一个子问题的处理时间为 indegree(t)+O(1)
indegree(t):入度数也就是相似(u,t)边的数量,须要去遍历全部t的入边O(1):判断是否是有入边
总共的执行时间为
$$\sum_{v\in V}(indegree(v)+O(1))=O(E+V)$$
要求s到v的最短路径 $\delta(s,v)$,首选须要去求 $\delta(s,a)$,而后是$\delta(s,b)$,到b节点有两条路径:$\delta(s,s)$和$\delta(s,v)$,此时去memo中查$\delta(s,v)$是不存在的,又会这回查询,致使了一个死循环
方式是去环,将原来的图一层一层的展开。
假设从s到v须要的路径为k步,那么能够获得 $\delta_k(s,v)$=$min_{(b,v)\in E}(\delta_{k-1}(s,b)+w(b,v))$,当k递减到0的时候,其实也就是从s到s自己
所须要的展开层数为:|V|-1
对于求最短路径来说,最长不能超过|V|-1,不然就是成环,会形成循环的状况(从0开始的计数),这就是为何Bellman-Ford的外层循环是 |V|-1
每层的节点数为全部的节点。那么总共的节点数为|V'|=|V|(|V|-1)+1=O($V^2$),边数是|E'|=|E|(|V|-2)+1=O(VE)。转换后的图是DAG图,那么实际上的时间为O(V'+E')=O(VE)。这也就是从动态规划的角度去看Bellman-Ford算法
节点的数目是1个源点,边的数目是每多一层实际上就多了加了一遍全部的边。
例子 | 斐波那契数列 | 最短路径 |
---|---|---|
1:定义子问题 | $F_k$ 其中$1\leq k \leq n$ | $\delta_k(s,v)$ 其中 $v\in V, 0\leq k < V $ |
子问题数量 | n | $V^2$ |
2:猜想 | 什么都没作,彻底是定义 | 节点v的入边(若是存在的话) |
选择的数量 | 1 | v的入边数+1 |
3:关联全部的子问题 | $F_k=F_{k-1}+F_{k-2}$ | $\delta_k(s,v) =min_{(u,v)\in E}(\delta_{k-1}(s,u)+w(u,v))$ |
子问题的时间 | $\theta(1)$ | $\theta(1+入度(v))$ |
4:重用子问题结果并记下新的结果 | for k=1,..,n | for k=0,1,..,V-1 |
总共耗时 | $\theta(n)$ | $\theta(VE)+\theta(V^2)$ (若是存在入度,就有后项) |
5:解决原有的问题 | $F_n$ | $\delta_{v-1}(s,v) ,v \in V$ |
额外耗时 | $\theta(1)$ | $\theta(V)$(Bellman-Ford最后的遍历) |