头歌 MapReduce 最优路径的算法。

任务描述
本关任务:根据相关知识内容实现 MapReduce 最优路径的算法。

相关知识
为了完成本关任务,你需要掌握:

最优路径概述;
Dijkstra 算法描述;
算法原理;
最优路径分析。
最优路径概述
最优路径算法是用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。最优路径算法问题分为单源点最短路径和多源点最短路径:

单源点最短路径:指给定一个确定的源点,计算该点到其他顶点的最短距离;

多源点最短路径:指计算图中的所有顶点的到其他顶点的最短路径。

Dijkstra 算法描述
Dijkstra 算法(迪杰斯特拉算法)是由荷兰计算机科学家狄克斯特拉于 1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。

Dijkstra 采用路径长度递增的关系进行最短路径的计算。主要算法思想如下:

把顶点集合 V 分成两组: 1)S: 已求出的顶点的集合 (初始时只含有源点 VO); 2)V-S=T: 尚未确定的顶点集合。
将 T 中顶点按递增的次序加入到 S 中,保证:
从源点 VO 到 S 中其他各顶点的长度都不大于从 VO 到 T 中任何顶点的最短路径长度;
每个顶点对应一个距离值。
注意:
S 中顶点: 从 VO 到此顶点的长度;
T 中顶点: 从 VO 到此顶点的只包括 S 中顶点作中间顶点的最短路径长度。

算法原理
Dijkstra 算法伪代码如下:

Dijkstra(G,w, s)
d[s] ← 0
for all vertex v ∈ V do
d[v] ← ∞
Q ← {V }
while Q != ∅ do
u ←ExtractMin(Q)
for all vertex v ∈ u.AdjacencyList do
if d[v] > d[u] + w(u, v) then
d[v] ← d[u] + w(u, v)
Dijkstra 算法关键的一点是优先队列 Q,它保存了全局的从源点出发最近的结点。而 map-reduce 则无法做到这一点。

基于 map-reduce 的并行算法跟 Dijkstra 算法有点类似,它也基于 Dijkstra 的迭代思想,伪代码如下:

# Mapper类
class Mapper
method Map(nid n, node N)
d ← N.Distance
Emit(nid n,N) //Pass along graph
structure [1]
for all nodeid m ∈ N.AdjacencyList do
Emit(nid m, d+w) //Emit distances to
reachable nodes [2]
# Reducer类
class Reducer
method Reduce(nid m, [d1, d2, . . .])
dmin←∞
M ← ∅
for all d ∈ counts [d1, d2, . . .] do
if IsNode(d) then
M ← d //Recover graph
structure
else if d < dmin then //Look for shorter
distance
dmin ← d
M.Distance← dmin //Update shortest
distance
Emit(nid m, node M)
它每次迭代执行一个map-reduce job,并且只遍历一个节点。在 Map 中,它先输出这个节点的完整邻接节点数据,即 [1]。然后遍历该节点的邻接节点,并输出该节点 ID 及权重。在 Reduce 中,对当前节点 m,遍历 map 的输出权重,若比当前的路径值小,则更新。最后输出该节点的路径值及完整邻接节点数据,作为下一次迭代的输入。

实现上有个细节需要注意的是,map 的输出有两种类型的数据:邻接节点数据和权重数据,这可以通过一个包装类,并设置一个 dataType 变量来实现。

当遍历完所有的节点之后,迭代就终止了。

最优路径分析
原始数据:

A    (B,10)    (D,5)
B    (C,1)    (D,2)
C    (E,4)
D    (B,3)    (C,9)    (E,2)
E    (A,7

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的苦13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值