因此,dijkstra算法(最好的)用于搜索加权(无负)和连通图的最短路径。 Dijkstra算法可用于找到两个点/顶点的最短路径。它可以用来找到所有顶点的最短路径。
问题: 我的理解是正确的吗? 它还能用于找到某些顶点的最短路径吗?例如,图表有A,B,C,D,E,F,G,H,I,J,K。我们只对A,B的最短路径感兴趣; C,K。有可能我们只用一次算法来找出两条路径吗?
答案 0 :(得分:1)
您需要运行两个 Dijkstras。一个从A
开始,一个从C
开始。
您可以做的是从{A, C}
(设置Dijkstra )运行它,直到找到B
和K
的路径。但是,这并不能保证生成的路径实际上是从A
到B
和C
到K
,它也可能是C, B
和{{1 }}。实际上,C, K
和{A, C}, B
的所有组合都是可能的。
最好的
完全没有。这是一个很好的概念,并且大量用于许多其他类似的算法。有许多变体,如A *,Arc-Flags等。但是原始的Dijkstra非常慢,因为它同样可以向各个方向搜索。
想象一下您已经为整个世界建模的查询。您的目的地距离{A, C}, K
。然后Dijkstra将找到1 hour
中可以到达的所有节点的最短路径。所以它也会考虑到你的邻国的短途飞行,即使这是完全错误的方向。算法1 hour
是Dijkstra的一个简单修改,试图通过引入一个能够(希望)对最短路径距离进行良好猜测的启发式函数来改进它。通过这种方式,你的Dijkstra获得了方向感,并试图首先将搜索优先考虑到目的地的方向。
一个简单的启发式算法是 as-the-crows-fly 。请注意,这种启发式方法在道路网络上表现不佳,特别是在公交网络上表现不佳(您经常需要将A*
推向错误的方向才能上高速公路,让您最后到达,或者您需要第一次开车到一个大城市,以获得一个良好的快速火车)。其他启发式算法涉及计算地标,它们会产生非常好的结果,但需要大量的预计算和空间(通常不是问题)。
答案 1 :(得分:0)
首先,Dijkstra不是最好的算法,在大多数实际实现中,许多启发式算法都胜过它。
我们只对A,B的最短路径感兴趣; C,K
看起来您可以查看A*算法,该算法可以消除不会以最低成本引导您到达目的地的节点。但它需要对各个节点到目的地的距离进行良好估计(因此需要启发词)。
来到你的主要问题,答案是肯定的,不是一些开销。我们都知道,每当节点从最小堆中移除时,它就会为算法完成。
因此,只要您的节点从最小堆中删除,只需终止它,但这并不意味着它确实只找到给定对的最短距离。在目标节点之前从最小堆中删除的所有节点也是它找到最短路径的节点。
此外,您的目标节点可能是从最小堆中删除的最后一个节点,这基本上意味着您已经计算了从源到所有节点的最短路径。