当前位置: 首页 > 知识库问答 >
问题:

Dijkstra算法,对于某些节点(不是两个,不是整个图)的最短路径只运行一次

慕胡媚
2023-03-14

因此,dijkstra算法是(最佳的)用于搜索加权(无负)连通图的最短路径的算法。Dijkstra算法可用于寻找两点/顶点的最短路径。它可以用来寻找所有顶点的最短路径。

问题:我的理解正确吗?它还可以用于查找某些顶点对的最短路径吗?例如,图有A,B,C,D,E,F,G,H,I,J,K,我们只对A,B的最短路径感兴趣;C、 K.我们可能只转动算法一次就找到两条路径吗?

共有2个答案

陶飞鸿
2023-03-14

首先,Dijkstra不是最好的算法,许多启发式算法在大多数实际实现中都优于它。

我们只对A,B的最短路径感兴趣;C、 K

看起来你可以看一看*算法,它消除了那些不会以最低成本将你带到最终目的地的节点。但它需要对各个节点到目的地的距离进行良好的估计(因此也需要“启发式”一词)。

至于你的主要问题,答案是肯定和否定的,还有一些间接费用。我们都知道,每当一个节点从min堆中移除时,算法就完成了。

因此,一旦您的节点从最小堆中移除,就终止它,但这并不意味着它只找到给定对的最短距离。在目标节点之前从最小堆中移除的所有节点也是它找到最短路径的节点。

另外,您的目标节点可能是从最小堆中删除的最后一个节点,这基本上意味着您已经计算了从源到所有节点的最短路径。

胡弘毅
2023-03-14

你需要跑两个迪克斯特拉。一个从A开始,另一个从C开始。

您可以做的是从{A, C}(一组Dijkstra)运行它,直到您找到了通往BK的路径。但这并不能保证生成的路径实际上是从ABCK,它也可能是C,BC,K .实际上,所有{A, C}, B{A, C}, K的组合都是可能的。

最好的

一点也不。这是一个很好的概念,大量用于许多其他类似的算法。有许多变体,如A*、Arc-Flags等。但是原始的Dijkstra是超级慢,因为它同样在各个方向搜索。

想象一个查询,您在其中模拟了整个世界。您的目的地距离1小时。然后,Dijkstra将找到在1小时内可以到达的所有节点的最短路径。所以它也会考虑到你的邻国进行短暂的飞行,即使这是完全错误的方向。算法A*是Dijkstra的一个简单修改,它试图通过引入一个启发式函数来改进该算法,该函数能够(希望)很好地猜测最短路径距离。通过这种方式,你的Dijkstra获得了方向感,并尝试首先优先搜索目的地的方向。

一个简单的启发式方法是像乌鸦一样飞翔。请注意,这种启发式方法在道路网络上表现不佳,在公交网络上表现尤其糟糕(你通常需要驾驶10分钟进入错误的方向才能上一条让你最终提前到达的高速公路,或者你需要先驱车到某个大城市才能获得一辆好的快车)。其他启发式算法涉及计算地标,它们产生相当好的结果,但需要大量的预计算和空间(通常不是问题)。

 类似资料:
  • Dijkstra算法说 对于图中给定的源节点,算法找到该节点和其他节点之间的最短路径 我得到了算法来找到那个节点和其他节点之间的最短路径。但是我的问题是,如果我需要为Linkedin/facebook这样的大图找到两个特定节点(比如N1和N2)的最短路径,我需要计算该节点N1和领英上其他节点(用户,意味着十亿用户)之间的距离吗首先,将其存储在高速缓存中,然后在询问两个节点的最短距离时从高速缓存中返

  • 我已经从Cormen的第三版参考“算法介绍”中找到的伪代码中实现了Dijkstra算法,用于单源最短路径问题。 我的实现是在python上使用链接列表在邻接列表表示中表示图形。这意味着节点列表是一个链接列表,每个节点都有一个链接列表来表示每个节点的边缘。此外,我没有实现或使用任何二进制堆或斐波那契堆作为算法所需的最小优先级队列,因此当过程需要提取与源距离最小的下一个节点时,我在节点链表内搜索O(V

  • 最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出。迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。 这个算法的python实现途径很多,网上能够发现不少。这里推荐一个我在网上看到的,本来打算自己写,看了这个,决定自己不写了,因为他的已经太好了。 解决(Python) #

  • 本文向大家介绍java实现Dijkstra最短路径算法,包括了java实现Dijkstra最短路径算法的使用技巧和注意事项,需要的朋友参考一下 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。 Dijkstra一般的表述

  • 我试图通过一个节点图进行广度优先搜索遍历,然后我将尝试找到一个节点和另一个节点之间的最短距离。这就是维基百科的BFS算法: 我有自己的节点类,节点的距离设置为最大。我的版本基于第一个代码的风格: 我试图让这段代码也能找到一个节点和另一个节点之间的最短路径。例如 我如何修改BFS代码来实现这一点?如果在这个循环中是不可能的,那么还有什么其他的方法呢? 如果我的代码或我的要求有任何混淆,请通知我。非常

  • 假设我有一个节点表示位置的图。从某些节点N开始,我想经由可能的最短路径到达另一个节点M。问题是我想避免一些节点,与它们保持一定的距离(比如至少有D个节点)。 是否有一种图算法可以解决具有节点回避要求的最短路径问题?加权图(从待避免节点发出无限长边)是这里的解决方案吗?