[英]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.