文章目录
-
- 前言
- 参考目录
- 学习笔记
-
- 0:引入介绍
- 1:APIs
- 1.1:API:加权有向边
- 1.2:Java 实现:加权有向边
- 1.3:API:加权有向图
- 1.4:Java 实现:加权有向图
- 1.5:API:最短路径
- 2:最短路径性质
- 2.1:最短路径的数据结构
- 2.2:边的松弛 edge relaxation
- 2.3:最优性条件 optimality conditions
- 2.4:通用算法 generic shortest-paths algorithm
- 3:Dijkstra 算法
- 3.1:demo 演示
- 3.2:证明
- 3.3:Java 实现
- 3.4:计算图生成树
- 3.5:运行时间
- 4:无环加权有向图 edge-weighted DAGs
- 4.1:demo 演示
- 4.2:证明
- 4.3:Java 实现
- 4.4:最长路径
- 5:负权重 negative weights
- 5.1:失败尝试
- 5.2:负权重环 negative cycles
- 5.3:Bellman-Ford 算法
- 5.3.1:demo 演示
- 5.3.2:算法分析
- 5.4:成本开销小结
- 6:小结
前言
本篇主要内容包括:APIs、最短路径性质、Dijkstra 算法 、无环加权有向图 以及 负权重。
参考目录
- B站 普林斯顿大学《Algorithms》视频课
(请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。) - 微信读书《算法(第4版)》
(本文主要内容来自《4.4 最短路径》) - 官方网站
(有书本配套的内容以及代码)
学习笔记
注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。
注3:如果 PPT 截图中没有翻译,会在下面进行汉化翻译,因为内容比较多,本文不再一一说明。
0:引入介绍
加权有向图的最短路径(shortest paths in an edge-weighted digraph):
最短路径的应用:
![L15-44ShortestPaths_03]
- PERT/CPM:计划评审技术/关键路径法
- 地图路线规划
- 接缝雕刻(图像缩放中的内容感知算法)
- 纹理映射(计算机图形学中将图像纹理贴到三维模型表面的技术)
- 机器人导航技术
- TeX 中的排版设置
- 城市交通规划
- VLSI 芯片的最佳流水线设计
- 电话营销员操作员调度问题
- 电信消息的路由选择
- 网络路由协议(如 OSPF、BGP、RIP)
- 利用货币兑换市场中的套利机会
- 根据既定交通拥堵模式确定卡车最优行驶路线
Shortest path is a really interesting and important problem solving model. There’s all kinds of important practical problems that can be recast as shortest paths problems. And because we have efficient solutions to the shortest path, efficient algorithms for finding shortest paths, we have efficient solutions to all these kinds of problems.
最短路径是一个非常有趣且重要的问题解决模型。许多重要的实际问题都可以被重新表述为最短路径问题。正因为如此,我们拥有寻找最短路径的有效解决方案,即高效的最短路径算法,因此也就拥有了解决这类各种问题的有效方法。
最短路径的不同类型:
顶点类型:
- 单源:从一个顶点 s 到其他所有顶点。
- 单汇点:从每个顶点到另一个特定顶点 t。
- 源汇点:从一个顶点 s 到另一个顶点 t。
- 全对全:在所有顶点对之间。
边权重限制:
- 非负权重:所有边的权重都是非负数。
- 欧几里得权重:边权重基于欧几里得距离。
- 任意权重:边的权重可以是任意数值。
循环条件:
- 无有向循环:图中不存在有向循环。
- 无负权循环:图中不存在权重总和为负值的循环。
简化假设: 从顶点 s 到每个顶点 v 都存在最短路径。
1:APIs
1.1:API:加权有向边
1.2:Java 实现:加权有向边
edu.princeton.cs.algs4.DirectedEdge
1.3:API:加权有向图
1.4:Java 实现:加权有向图
edu.princeton.cs.algs4.EdgeWeightedDigraph
1.5:API:最短路径
2:最短路径性质
2.1:最短路径的数据结构
目标: 找到从顶点 s 到其他所有顶点的最短路径。
观察结论: 存在一种最短路径树(Shortest Paths Tree, SPT)解法。为什么?
结果: 可以通过两个以顶点索引为键的数组来表示 SPT:
distTo[v]
表示从顶点 s 到顶点 v 的最短路径长度。edgeTo[v]
表示从顶点 s 到顶点 v 的最短路径上的最后一段边。
对应书本的介绍: