繁体   English   中英

如何在Ruby中存储地图并使用BFS生成图形

[英]How to store a map and generate a graph with BFS in Ruby

所以我想这对于MSC中的MSC来说是一个经典的问题。

我有N元素,我也有距离。 假设我有3个具有以下距离的元素。 它是对称的,所以

A -> B == B -> A

它看起来像一个矩阵:

   A,  B,  C,  
A  0, 10,  20 
B 10,  0,  30
C 20, 30,   0

我的问题是:

  • 如何有效地存储(什么数据结构)
  • 获得链接列表的最有效方法是什么,其中距离总和最小

在这种情况下,最好的是

B -> A -> C = 30 which equals to C -> A -> B

其他情况:

A -> B -> C = 40 which equals to C -> B -> A

我的印象是BFS可能适合这个。 链接到英文文档是好的,甚至亚马逊的书籍......

数据结构的理想解决方案是邻接列表

邻接列表只是一个对象列表(表示图形上的顶点)。 每个对象都有一个列表,其中包含它具有相邻边的所有顶点以及相应的权重。

在ruby中,一个简单的实现可能看起来像:

vertices = {}
a = Vertex.new
b = Vertex.new

a.add(b, 10)
b.add(a, 10)

vertices[a] = a
vertices[b] = b

找到最短加权路径的算法称为Dijkstra

如果您希望在运行算法后获得最短路径,则可以进行回溯。 这是通过在到达时存储每个节点的(最佳)父节点来完成的。 为了做到这一点,你可以为每个被访问节点创建一个哈希值,该哈希值以最低的成本映射到导致它的节点。

完成算法后,递归回溯可能如下所示:

def traceback(parent, start, node, path)
  if(start == node)
     (path + start.to_s).reverse
  else
     path += node.to_s + " "
     traceback(parent, start, parent[node], path)
  end
end

我听说Dijkstra有一个算法来导航加权图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM