Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 加权有向图中两节点间的距离_Algorithm_Graph_Shortest Path - Fatal编程技术网

Algorithm 加权有向图中两节点间的距离

Algorithm 加权有向图中两节点间的距离,algorithm,graph,shortest-path,Algorithm,Graph,Shortest Path,在正加权有向图中,哪种算法最适合搜索两个节点之间的最短距离 我知道dijkstra是一个选项,但它从src计算到所有节点。和弗洛伊德·沃沙尔一样 还有一个问题。我需要一个节点的距离,它是源和目标 例如: src-F,dest-F 我需要它来计算这个例子中的2.45,而不是dijkstra得到的0。我可以修改dijkstra吗? 我已经实现了这个 (来源:)如果A是一种查找从一个顶点到另一个顶点的最短路径的算法,而B是一种查找一个顶点和所有其他节点之间的最短路径的算法,那么A的最佳复杂度并不比B

在正加权有向图中,哪种算法最适合搜索两个节点之间的最短距离

我知道dijkstra是一个选项,但它从src计算到所有节点。和弗洛伊德·沃沙尔一样

还有一个问题。我需要一个节点的距离,它是源和目标

例如:

src-F,dest-F 我需要它来计算这个例子中的2.45,而不是dijkstra得到的0。我可以修改dijkstra吗? 我已经实现了这个



(来源:)

如果A是一种查找从一个顶点到另一个顶点的最短路径的算法,而B是一种查找一个顶点和所有其他节点之间的最短路径的算法,那么A的最佳复杂度并不比B的最佳复杂度好,这是一个已证明的事实。即,您无法计算到单个顶点的路径,您还必须计算到所有其他节点的路径。简单地说,如果您甚至不知道到其他节点的路径,如何确保找到了最短路径

然而,即使不存在比算法B更复杂的算法A,A的特定实现可能比B的实现更优化,直到一个常数因子。对于正边,可以在目标顶点松弛时停止Dijkstra算法。但在最坏的情况下,您可能仍必须处理所有顶点

这种优化在有负边的情况下是不可能的,但Dijkstra算法也不能处理这种情况。对于这种情况,您需要算法

弗洛伊德·沃沙尔(Floyd Warshall)在这里做得太过分了,显然你不需要从所有顶点到所有其他顶点的路径。所以我认为Dijkstra是个不错的选择。如果您正在寻找最佳的复杂性,那么可以使用基于堆的实现,甚至Fibonacci堆。中给出了所有情况的复杂性。还指出:

这个[Dijkstra with Fibonacci堆]是渐近已知的最快的单源最短路径 无界非负的任意有向图的算法 重量


所以你不必费心去寻找任何渐进的更好的算法。

Dijkstra for start->goal。Floyd Warshall适用于任何->任何。当然,你也可以从Dijkstra算法得到总权重。如果代码在实际权重为2.45时表示为0,则表示有问题(代码、您的实现或您对它的使用)。Dijkstra不会从src计算到所有节点;它只计算比dest更接近的所有节点,因为它必须这样做。但是,当开始和结束节点与我的问题中描述的节点相同时,如何解决问题?当您设置dijkstra起始节点时,是否必须具有权重0?使用Floyd Warshall是一个选项,只需声明距离[F][F]=无穷大。或者,你可以考虑创建一个F′,它是F力的复制至少一个步骤。除非至少完成了一次递归,否则不要检查终结性。这与
while(x)f()之间的区别相同
do f();而(x)
,使用支持差异的语言。与F相同,不连接F本身。因此,A-F,E-F,F-D,A-F',E-F',F'-D,但没有F-F'或F'-F。如果你真的想压缩每一点性能,并且知道你在做什么,你当然可以自己做每件事;但通常情况下,您可以使用任何合适的优先级队列实现,因为它比大多数程序员在自己的设备上编写的要更好(Java在标准库中有
PriorityQueue
,Ruby有几个实现作为gems…)。给定优先级队列,Dijkstra算法对于代码来说是微不足道的。