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

时间:2012-08-08 22:26:55

标签: performance graph big-o dijkstra breadth-first-search

我想出了一个基于BFS的路径寻找算法,作为Diskjstra的替代品(说实话,我怀疑其他人在过去提出过它,但我无法在任何地方找到任何提及它的地方)。我正在试图弄清楚运行时间是什么,但我和我的朋友正在辩论它并且无法得出确定的答案。这是Go中算法的描述和实现的链接: https://github.com/joshlf13/bfspath

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

我的理由是这样:BFS的每次传递都会增加e的倍数所考虑的顶点数。此外,每次考虑顶点时,都是操作。因此,每次通过是v(通过的顶点数)乘以e。如果v为1则e e e ^ 2等,v * e为e + e ^ 2 + e ^ 4等。

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

思想...?

1 个答案:

答案 0 :(得分:0)

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

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

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

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