繁体   English   中英

计算多点之间的最短距离

[英]Compute the shortest distances beetween multiple point

所以这是我的问题:我需要一种算法,给定一组n个坐标点(x;y) ,将所有点连接在一起的最短路径是什么,没有任何限制,这意味着一个点可以链接到任意数量的其他点。

解决该问题的第一个想法是针对每个未链接的点,找到最近的点并链接到该点,然后从未链接的点列表中删除这两个点,然后重新开始,直到没有更多的相似点为止。 您已在此阶段创建了近点块。 然后,将这些块链接起来,找出它们之间的最短距离。

这种方法的问题是1.它没有给出最短的路径2.效率似乎很低,所以我问您,哪种类型的算法可以进行这种计算(我只需要两点之间的总距离,我不需要关心它们实际上是如何链接的)?

听起来好像可以使用生成树算法。 用伪代码:

build_tree(unconnected_nodes):
  connected_nodes = set()
  // pick a random unconnected node
  connected_nodes.add(unconnected_nodes.pop())

  while not empty(unconnected_nodes):
     best_connected_node = None
     best_unconnected_node = None
     shortest_distance = +Infinity

     for node1 in connected_nodes:
       for node2 in unconnected_nodes:
         if distance(node1, node2) < shortest_distance:
           shortest_distance = distance(node1, node2)
           best_unconnected_node = node2
           best_connected_node = node1
     connect(best_connected_node, best_unconnected_node)
     unconnected_nodes.remove(best_unconnected_node)
     connected_nodes(best_unconnected_node)

  return connected_nodes

这是假设您拥有的东西本质上是一个完全连接的图,并且通过“坐标”和“无限制”来实现,我认为这就是您所拥有的。 如果不是,则需要遍历从连接节点到未连接节点的顶点集。

我认为您可以应用Prim的最短路径算法或Kruskal最短路径算法。 这些算法通常提供网络中两个不同节点之间的最短路径。 对于您的问题,您可以将每个坐标对表示为一个顶点,并通过创建最小的边生成树来找到它们之间的最短路径。 我在下面写伪代码:

mst = queue of all the result edges(or co-ordinates)
p =  queue of all the connected edges
while p is not empty
  edge e = min of p
  if union-find(both vertices of edge e)
    continue
  else
    union-find.add(both vertices of edge e)
    mst.add(e)

最后,您将拥有“ mst”,代表所有坐标之间的最短路径

暂无
暂无

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

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