算法设计与分析课件--贪心法-单源最短路径问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4
4.3 贪心选择的基本要素
贪心法基本要素
1. 贪心选择性质:
✓ 贪心选择可以依赖于以往的选择,但不依赖于将来 所作出的选择,也不依赖于子问题的解。
✓ 动态规划采用自底向上的方式解各子问题, 而贪心 算法采用自顶向下的方式, 迭代方式做出相继的贪 心选择, 每一次贪心选择就将所求问题简化为规模 更小的子问题.
3. 合并:
将各个阶段的解合并为原问题的一个可行解。
8
第四章 贪心法
目录
4.1
概述
4.2
会场安排问题
4.3 贪心选择的基本要素
4.4 单源最短路径问题
4.5 最小生成树问题
9
4.4 单源最短路径问题
单源最短路径 (SSSP) 问题的几个概念:
❖给定一个有向带权图G =(V, E),V为结点集合,E为 带非负权w的边集合。
迭代
S
u dist[2] dist[3] dist[4] dist[5]
初始 {1} - 10 maxint 30
100
1
2
3
4
V
S
16
4.4 单源最短路径问题
Dijkstra算法的求解步骤: ❖步骤3:贪心选择结点。在集合V-S中依照贪心策略 来寻找使得dist[u]具有最小值的顶点u,u就是集合 V-S中距离源点s最近的顶点。
14
4.4 单源最短路径问题
Dijkstra算法的求解步骤: ❖步骤1:设计合适的数据结构。带权邻接矩阵a记录 结点之间的权值,数组dist来记录从源点到其它顶 点的最短路径长度,数组pre来记录最短路径;
15
4.4 单源最短路径问题
Dijkstra算法的求解步骤: ❖步骤2:初始化。令集合S={s},对于集合V-S中的 所有顶点u,设置dist[u]=a[s][u];如果顶点u与源点 s相邻,设置pre[u]=s,否则pre[u]=-1;
迭代
S
u dist[2] dist[3] dist[4] dist[5]
S
初始 {1} - 10 maxint 30
100
1 {1,2} 2 10
60
30
100
2
3
4
12
3
4
5
pre - 1
2
1
1
V-S
19
4.4 单源最短路径问题
Dijkstra算法的求解步骤: ❖步骤6:对相关结点做松弛处理。对集合V-S中的所 有与顶点u相邻的顶点x,如dist[x]>dist[u]+a[u][x], 则dist[x]=dist[u]+a[u][x]并设置pre[x]=t。转步骤3。
迭代
S
初始 {1}
1
2
3
4
1
pre -
u dist[2] dist[3] dist[4] dist[5]
- 10 maxint 30
100
2
3
4
5
1
-
1
1
V-S
S
17
4.4 单源最短路径问题
Dijkstra算法的求解步骤: ❖步骤4:更新集合S和V-S。将顶点u加入集合S中, 同时更新集合V-S; ❖步骤5:判断算法是否结束。如果集合V-S为空,算 法结束。否则,转步骤6;
算法设计与分析
1
第四章 贪心法
目录
4.1
概述
4.2
会场安排问题
4.3 贪心选择的基本要素
4.4 单源最短路径问题
4.5 最小生成树问题
2
4.3 贪心选择的基本要素
贪心法基本要素
1. 贪心选择性质:
✓ 所求问题的整体最优解可通过一系列局部最优的 选择获得,即通过一系列的逐步局部最优选择使 得最终的选择方案是全局最优或近似全局最优的。
22
4.4 单源最短路径问题
Dijkstra算法的伪代码:
DIJKSTRA(G, w, s)
INITIALIZE-SINGLE-SOURCE(G, s);
S Φ;
Q G.V;
d[s] = 0
while Q ≠ Φ do
for each v∈G.V
u EXTRACT-MIN(Q); d[v] = ∞
取出元素的时间:O(1),取完元素后恢复二叉堆时间:O(log|V|)
26
4.4 单源最短路径问题
Dijkstra算法复杂度分析 :时间复杂性:
首先,构建最小二叉堆的成本为O(|V|),每次EXTRACT-MIN 操作的执行时间为O(lg|V|),一共有|V|次这样的操作; 同理,由于每条边仅被调整一次,一共被调整O(|E|)次,而每 次松弛操作即为调整节点在二叉堆中的位置,其时间成本为 O(lg|V|),从而,算法的总运行时间为O((|V|+|E|)lg|V|)。 若采用斐波那契堆来实现最小优先队列,则算法的运行时间 可以改善到O(|V|lg|V|+|E|)。
2. 最优子结构性质:
✓ 一个问题的最优解包含其子问题的最优解。
3
4.3 贪心选择的基本要素
贪心法基本要素
1. 贪心选择性质:
✓ 所求问题的整体最优解可通过一系列局部最优的 选择获得, 这是贪心算法可行的第一个要素,也是 与动态规划的区别。
✓ 动态规划每步所做出的选择依赖相关子问题的解。 贪心算法仅考虑当前状态下做出最好的选择,局 部最优。
❖对于S ⊆ V,dist[i]是从s到i相对于S的最短路径长度。那么对于
任何正整数k,当算法进行第k步时, ∀i ∈ S, 有dist[i]=short[i]。
28
4.4 单源最短路径问题
Dijkstra算法的正确性证明 – 贪心选择性质: ❖k=1时,S={s},显然,dist[s]=short[s]=0成立; ❖ 假设对于k,命题为真,即算法前k步选择的结点i都有
❖给定V中的一个结点s,称为源点。一个源点即为单源。
❖图中一条路径p=<v0, v1, …, vk>,其带权路径长度w(p) 为构成该路径的所有边的权重之和:
k
W ( p) (vi1, vi) i 1 10
4.4 单源最短路径问题
单源最短路径问题举例
11
4.4 单源最短路径问题
单源最短路径 (SSSP) 问题描述:
空间复杂度:
定义了辅助变量Q,其最多包含|V|个节点,即O(|V|)。
27
4.4 单源最短路径问题
Dijkstra算法的正确性证明 – 贪心选择性质: ❖假设给定一个有向带权图G =(V, E),V为结点集合,E
为带非负权w的边集合。s∈ V表示源点, short[i]表示s到i的
最短路径长度.
迭代
S
u dist[2] dist[3] dist[4] dist[5]
S
初始 {1} - 10 maxint 30
100
1 {1,2} 2 10 maxint 30 100
2
3
4
12
3
4
5
pre - 1
-
1
1
V-S
18
4.4 单源最短路径问题
Dijkstra算法的求解步骤: ❖步骤6:对相关结点做松弛处理。对集合V-S中的所 有与顶点u相邻的顶点x,如dist[x]>dist[u]+a[u][x], 则dist[x]=dist[u]+a[u][x]并设置pre[x]=u。转步骤3。
6
4.3 贪心选择的基本要素
贪心法基本要素
2. 最优子结构性质:
✓ 一个问题的最优解包含其子问题的最优解。 ✓ 是动态规划和贪心法求解的关键特征. ✓ 可以采用反证法证明。
7
4.3 贪心选择的基本要素
贪心法解题步骤 1. 分解:
将原问题分解为若干个相互独立的阶段。
2. 解决:
对于每个阶段依据贪心策略进行贪心选择,求出 局部的最优解。
迭代
S
u dist[2]
初始 {1} - 10
1 {1,2} 2 10
2 {1,2,4} 4 10
3 {1,2,4,3} 3 10
4
12
3
pre - 1
4
dist[3] maxint
60 50 50
4 1
dist[4] 30 30 30 30
5 3
dist[5] 100 100 90 60
S V-S
5
4.3 贪心选择的基本要素
贪心法基本要素
1. 贪心选择性质:
✓ 对于一个具体问题, 要确定它是否具有贪心选择性 质, 必须证明每一步所做出的贪心选择最终导致问 题的整体最优解.
✓ 首先考察一个整体最优解, 每做一步贪心选择后, 原问题变为规模更小的类似子问题, 然后用数学归 纳法证明, 通过每一步做贪心选择,最终可以得到 整体最优解.
初始 {1} - 10
1 {1,2} 2 10
2 {1,2,4} 4 10
3 {1,2,4,3} 3 10
4 {1,2,4,3,5} 5 10
12
3
pre - 1
4
dist[3] maxint
60 50 50 50
4 1
dist[4] 30 30 30 30 30 5 3
dist[5] 100 100 90 60 60
21
4.4 单源最短路径问题
Dijkstra算法的求解步骤: ❖步骤6:对相关结点做松弛处理。对集合V-S中的所 有与顶点u相邻的顶点x,如dist[x]>dist[u]+a[u][x], 则dist[x]=dist[u]+a[u][x]并设置pre[x]=t。转步骤3。
迭代
S
u dist[2]
23
4.4 单源最短路径问题
Dijkstra算法复杂度分析 时:间复杂性:
❖初始化操作:O(|V|); ❖两重循环:while循环和for循环 1) 对while循环中的EXTRACT-MIN(Q)的操作:
若为无序数组实现优先队列, 则每次需要搜索整个数组来找到 最小值,操作时间为O(|V|),共有|V|次; 2) 对于for循环,由于每个节点只被加入S中一次,且邻居表中 的每条边在整个算法运行过程中只被检查一次,从而内层循 环的执行次数一共为O(|E|) ❖所以,该算法时间复杂性为O(|V|2+|V|+|E|)=O(|V|2)。
dist[v]<=dist[y]. 而 dist[y]+d(y, v)=L,
其中d(y,v)表示y和v之间的距离。于是,
dist[v]<=L 即算法对v选择的路径是s到v的 最短路径。
Ss
x
L
y
❖1959年提出的,但当时并未发表。因为在那个年 代,算法基本上不被当做一种科学研究的问题。
13
4.4 单源最短路径问题
Dijkstra算法设计: ❖集合S与V-S的划分:假定源点为u。集合S中的结 点到源点的最短路径的长度已经确定,集合V-S中 所包含的结点到源点的最短路径的长度待定。 ❖特殊路径:从源点出发只经过S中的结点到达V-S 中的结点的路径。 ❖贪心策略:选择特殊路径长度最短的路径,将其 相连的V-S中的结点加入到集合S中。
dist[i]=short[i].
❖第k+1步,选择了结点v(关联的边是<u, v>). 并假设存在
另一条从s到v的路径L(如图红色).
❖ 由于算法在这一步中选择
了v, 没有选择y, 则有
Ss
x
L
y
dist[v]<=dist[y]
u
v
29
4.4 单源最短路径问题
Dijkstra算法的正确性证明 – 贪心选择性质: ❖由于算法在这一步中选择v, 没有选择y, 则有
24
4.4 单源最短路径问题
Dijkstra算法复杂度分析 时:间复杂性:
如果是稀疏图,则可以使用二叉堆来实现最小优先 队列,如下图所示,这里我们需要采用小根堆。
二叉堆是一种近似满二叉树,差别在叶子节点; 25
4.4 单源最短路杂性:
以大根堆为例:
❖两个结点u和v之间的最短带权路径长度(u, v):
❖单源最短路径问题要求:计算源点s到其他各个结点 v的最短路径及其长度δ(s, v)。
12
4.4 单源最短路径问题
Dijkstra算法思想:
❖按各个结点与源点之间路径长度的非减次序,生 成源点到各个结点的最短路径的方法。
❖即先求出长度最短的一条路径,再参照它求出长 度次短的一条路径。依此类推,直到从源点到其 它各结点的最短路径全部求出为止。
S S ∪ {u};
for each v∈G.Adj[u] do if d[v] > d[u] + w(u, v)
RELAX(u, v, w);
d[v] = d[u] + w(u, v)
EXTRACT-MIN操作:找出最小元素并将之删除,称为优先队列; 实现方法:无序数组、有序数组、二叉堆(小根堆)
迭代
S
u dist[2] dist[3] dist[4] dist[5]
S
初始 {1} - 10 maxint 30
100
1 {1,2} 2 10
60
30
100
2 {1,2,4} 4 10
50
30
90
3
4
12
3
4
5
pre - 1
4
1
4
V-S
20
4.4 单源最短路径问题
Dijkstra算法的求解步骤: ❖步骤6:对相关结点做松弛处理。对集合V-S中的所 有与顶点u相邻的顶点x,如dist[x]>dist[u]+a[u][x], 则dist[x]=dist[u]+a[u][x]并设置pre[x]=t。转步骤3。
相关文档
最新文档