Performance 基于BFS的路径查找算法的运行时间

Performance 基于BFS的路径查找算法的运行时间,performance,graph,big-o,dijkstra,breadth-first-search,Performance,Graph,Big O,Dijkstra,Breadth First Search,我提出了一种基于BFS的路径查找算法,作为Diskjstra的替代方案(老实说,我怀疑其他人过去也提出过,但我在网上找不到任何提及)。我试图弄清楚跑步时间是多少,但我和我的朋友们正在争论这个问题,还没有找到一个明确的答案。以下是Go中算法的描述和实现的链接: 我的印象是运行时间是e+e^2+e^4+…+e^2d,其中e是每个顶点的平均边数,d是最终最短路径的距离(给出O(e^2d))。问题是,这取决于算法的结果,正如我的朋友指出的那样,不应该把算法的结果包括在运行时间的考虑中 我的推理是:BF

我提出了一种基于BFS的路径查找算法,作为Diskjstra的替代方案(老实说,我怀疑其他人过去也提出过,但我在网上找不到任何提及)。我试图弄清楚跑步时间是多少,但我和我的朋友们正在争论这个问题,还没有找到一个明确的答案。以下是Go中算法的描述和实现的链接:

我的印象是运行时间是e+e^2+e^4+…+e^2d,其中e是每个顶点的平均边数,d是最终最短路径的距离(给出O(e^2d))。问题是,这取决于算法的结果,正如我的朋友指出的那样,不应该把算法的结果包括在运行时间的考虑中

我的推理是:BFS的每一次通过都会增加e的倍数所考虑的顶点数量。此外,每次考虑顶点时,它都是e操作。因此,每个过程是v(过程中的顶点数)乘以e。如果v是1,那么e,那么e^2,等等,v*e是e+e^2+e^4,等等

一种不同的方法是考虑运行时间的数量考虑的边缘。长度为N的边执行N次操作。因此,对于具有E条边且平均边长度为N的图,它是O(N*E)。然而,这只适用于在算法运行期间考虑的图形部分,并且该子集的大小不随起点和终点之间的距离线性缩放,这使得真正考虑O()变得困难


想法…?

因此,您的算法最基本的问题是,当边具有实值权重/长度时,它无法保证正确答案。除非您完全准备好使用计算机上可用的最小浮点值“单位长度”(提示:它真的很小),否则您将无法分解每条边

因此,您的算法甚至只能在可以简化为统一网格的图形上返回正确答案,在该网格中,您在任何给定时间只能水平或垂直移动

至于分析运行时,您的朋友是绝对正确的。“真正考虑O()”并没有什么“困难”。你的算法在复杂性理论中被称为伪多项式时间。这意味着输入的大小是指数的,而值是多项式的。特别是,它是O(NE+V),其中N是图中所有边中最大的边权重


图上的伪多边形算法对于任何实际应用来说都太慢了,即使您可以保证整数边长度。你真的只能在等长网格上使用它,而人/已经/在等长网格上使用BFS;这不是“特殊算法”,而是BFS。

这比dijstra的速度快多少?这对于具有很长边的图来说可能会有糟糕的性能…如果边长度很小,则速度会更快。你是对的,如果边缘长度很长,速度也会非常慢。