C# 寻找最短路径的最佳算法(时间复杂度)是什么

C# 寻找最短路径的最佳算法(时间复杂度)是什么,c#,asp.net,algorithm,graph-algorithm,dijkstra,C#,Asp.net,Algorithm,Graph Algorithm,Dijkstra,我有一个 . 我必须计算最短+备用路径: 从一个顶点(A)到另一个顶点(B) 从所有顶点到单个顶点 一对顶点的 从每个顶点到每个其他顶点 我必须使用图形算法(dijkstra、BellManford、BFS)计算所有这些。谁能告诉我哪种算法是实现这些的最佳算法 *最好意味着最少的时间;复杂性这在很大程度上取决于您的数据。维基百科提供了一系列不同的算法,以及这些算法何时有用的一些线索。一个重要因素是是否可以对边的权重施加一些限制。基本分类如下: 相同的正权重 如果所有权重都相同且为正,则我们基本上

我有一个 . 我必须计算最短+备用路径:

  • 从一个顶点(A)到另一个顶点(B)
  • 从所有顶点到单个顶点
  • 一对顶点的
  • 从每个顶点到每个其他顶点
  • 我必须使用图形算法(dijkstra、BellManford、BFS)计算所有这些。谁能告诉我哪种算法是实现这些的最佳算法


    *最好意味着最少的时间;复杂性这在很大程度上取决于您的数据。维基百科提供了一系列不同的算法,以及这些算法何时有用的一些线索。一个重要因素是是否可以对边的权重施加一些限制。基本分类如下:

    相同的正权重 如果所有权重都相同且为正,则我们基本上希望使用最少数量的边来查找路径。在这种情况下,我们可以使用广度优先或深度优先搜索来查找O(E+V)时间内的单源最短路径。然后直接扩展到O(EV+V2)时间内的所有对

    非负边权重 对于单源最短路径问题,可以使用。对于普通的二进制堆,这会使您的时间复杂度达到O((E+V)log V)。使用Fibonacci堆,这可以改进为O(E+vlogv),这对于密集图更快

    或者,还有Gabow的缩放算法,其运行时间为O(E logR L)time,其中R是E/V,L是边的最大长度,但该算法比Dijkstra的算法复杂得多

    为了找到一对顶点之间的最短路径,您可能可以使用(或其导数之一),但这取决于合适的启发式方法的可用性

    负边权重,但没有负循环 单源最短路径由算法求解,时间复杂度为O(VE)


    所有对的最短路径都可以在O(EV+v2logv)时间内求解。此外,还有一个在O(V3)中解决的方法:在密集图上通常更快。

    如何定义“最佳”?最佳表示时间复杂度最小1和3是冗余的,否?是。。它们几乎是一样的。互联网上所有这些算法都应该考虑到复杂性。但是,如果您的实现确实是时间关键型的,那么您必须使用真实世界的数据进行性能度量。