[MIT6.006] 16. Dijkstra】的更多相关文章

先回顾下上节课的内容: 下面来看一个定理:对于所有的点来说,放松操作总是满足 d[v] ≥ δ(s, v).即点s到点v的最短路径总是小于或等于当前点d的路径权重.证明如下: 在正是进入复杂的图前,先看个简单的有向非循环图DAG(Directed Acyclic Graphs),内无负循环.下图是讲DAG如何找最短路径: 如果有循环且无负权重边呢?可以使用Dijkstra算法,具体如下: 由于Dijkstra算法有三个主要操作:插入点的优先队列,抽取最小优先值,减键操作.所有最后Dijkstra…
[MIT6.006] 系列笔记将记录我观看<MIT6.006 Introduction to Algorithms, Fall 2011>的课程内容和一些自己补充扩展的知识点.该课程主要介绍了一些基础的算法,课程主要内容分为以下八个模块: 模块 例子 Algorithmic Thinking 算法思维 Peak Finding 峰值寻找 Sorting & trees 排序和树 Event Simulation 事务模拟 Hashing 哈希 Genome Comparison 基因组…
在之前的课我们讲过了Dijkstra算法,先回顾下,如下图: 那么如果加速DIjkstra算法寻找最短路径呢?这节课上讲师讲了两种方法:双向搜索(Bi-Directional Search)和目标方向搜索(Goal-Directed Search). 一. 双向搜索(Bi-Directional Search) 在正式介绍双向搜索方式前,需要介绍下一个它的双向概念是什么样的,如下图所示: 总结来说就是forward和backward方向上分别定义各自的图变量(例:当前最小路径权重和df, db …
如果出现下图所示的负循环,会有相关点的当前最短路径为undefined(即无法定义). 之前我们也看过通用的最短路径算法思路,如下图所示: 这种通用算法会有两个问题: 时间复杂度呈指数性. 如果出现负循环,最短路径的计算会无法中止. 第一个问题能被Dijkstra算法解决,但它不能解决负循环带来的问题,而这节课讲的Bellman-Ford算法适用于负权重和负循环的图下进行最短路径的计算. Bellman-Ford算法一个大概的计算思路如下: 简单来说,就是对所有点正常relax edge完后,进…
在整理课程笔记前,先普及下课上没细讲的东西,就是下图,如果有个操作g(x),它最糟糕的时间复杂度为Ο(c2 * n),它最好时间复杂度是Ω(c1 * n),那么θ则为Θ(n).简单来说:如果O和Ω可以用同一个多项式表示,这里为c * n,那么这个多项式n就是我们所要求的渐进紧的界θ了: 上节课我们讲了下图的散列表: 有个问题就是怎么去选择散列表的大小m? 有个方法就是先假设从一个小的m=8开始,然后按照需求进行增长/缩短. 这里举个例子:如果n > m (n为key space的大小,m为散列表…
这节课主要讲的计算复杂度,一般有三种表达不同程度的计算复杂度,如下图所示: P:多项式时间: EXP:指数时间: R:有限时间内. 上图还给了一些问题的计算复杂度的对应结果,关于一些细节例如NP, NP-hard等,下面会深入讲到. 在现实应用中,大多数决策问题是不可计算的. 我们先来看下NP是什么? 答:NP是一种计算复杂度,指在运气好的算法下,决策问题能在多项式时间下得到解决.另外,也可以被理解为:决策问题的解决方法能在多项式时间下被检查.百度给出的解释是:NP类问题:所有的非确定性多项式时…
之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问题那样子问题比较多,该怎么去解决? 一.Piano / Guitar Fingering 给定n个按键,找到每个键应该用哪只手指去按.假设有F个手指,刚开始手指f按在p键上,如果转移到用手指g按键q,这个转移难度为定义为d(p, f, q, g). 动态规划的解决思路如下(红叉内的内容是因为只考虑了…
这节课主要针对字符串/序列上的问题,了解如果使用动态规划进行求解.上节课我们也讲过使用前缀和后缀的概念,他们如下所示: 接下来,我们通过三个问题来深入了解下动态规划使用前缀.后缀和子串怎么去解决括号问题,编辑距离,背包问题. 一.括号问题 Parenthesization 在进行一些列矩阵乘法时,我们如果设计括号,可以使计算更加高效? 解决过程如下图所示: 子问题:求矩阵们A的最优相乘方式: 猜:上一次矩阵相乘应在哪? 递归:最小化矩阵相乘的损失: 拓扑排序:增加子串的大小: 原问题:DP(0,…
这节课通过讲解动态规划在文本对齐(Text Justification)和黑杰克(Blackjack)上的求解过程,来帮助我们理解动态规划的通用求解的五个步骤: 动态规划求解的五个"简单"步骤: 定义子问题: 猜部分解决方法: 关联子问题的解决方法; 递归&记录 或者 构建自下向上的动态规划表: 解决原问题. 拿上节课的例子(斐波那契数和最短路径)来看,如下图所示: 一.文本对齐 首先,我们先看下文本对齐问题,在使用word排版文字的时候,为了排版美观,我们常会用到文本两端对齐…
这节课讲动态规划的内容,动态规划是一种通用且有效的算法设计思路,它的主要成分是"子问题"+"重用".它可以用于斐波那契和最短路径等问题的求解上. 一.斐波那契 首先,我们来看下斐波那契问题是什么?传统做法和动态规划法有什么区别? 从上图就能很明显地看出动态规划采用了memorization的思路,将历史计算结果保存下来,这样就能避免递归过程中的重复计算. 我们总结动态规划在求解斐波那契数的内容如下: 记录召回(Memorized calls)只花常数时间.动态规划大…