如果图表非常大,你会如何修改BFS以找到从A到B的最短路径?

时间:2011-09-08 23:23:06

标签: algorithm optimization graph-theory

我的意思是“非常大的图形”是每个顶点有1000个相邻的顶点,但如果你去看最终的解决方案,从A到B的距离只有6(比方说)。

在这种情况下,使用基本的BFS算法会浪费掉,因为它会放置A的所有1000个相邻顶点,然后在下一轮中为每个顶点1000等等等等等等。 1000 ^ 6个顶点..

任何想法如何优化?或者更确切地说是有办法吗?

4 个答案:

答案 0 :(得分:8)

一件容易的事就是从两个方向开展工作:

在每个步骤中,执行以下操作:

  • 获取nbrsA的新邻居寻找B,如果找不到则设置nbrsA =新邻居
  • 获取nbrsB的新邻居寻找A,如果找不到则设置nbrsB =新邻居
  • 比较nbrsA和nbrsB

如果图形很大但高度连接,那么你将以这种方式节省相当多的空间,但它确实需要一些额外的时间来比较邻居集。

答案 1 :(得分:1)

您可以更改BFS以使用Dijkstras算法。 BFS和Dijkstras在某些方面是相关的,因此这种修改应该是可以接受的。由于这是一个电话屏幕,他们希望你有很多机会看到那里的关系。

答案 2 :(得分:1)

我同意,

这是一个有趣的问题。据我所知,有两件事可能会对你有所帮助:

  1. 同时向前和向后搜索。如果你的真实度最低为1000,那么你需要在BFS的第d次迭代中研究1000 ^ d个节点。这有效地将1000 ^(2d)减少到2 * 1000 ^ d。

  2. 在某些时候,BFS在内存消耗方面会过于昂贵。为了避免这种情况,你可以切换到'迭代深化':通过深度优先搜索(限制为1次迭代)然后进行DFS(限制为2次迭代)等来模拟BFS。开销是一个小常量(当然,这当然是这是不可取的),但这样你就可以避免出现内存问题,同时按照与BFS相同的顺序发现节点。

答案 3 :(得分:0)

两件事之一是真的:

这1000个顶点经常被共享,这意味着一旦它们在第1轮被发现,它们将在第2轮被忽略,从而大大降低你的搜索范围,

OR

这1000个顶点是唯一的,意味着您有数百万或数十亿个节点,这意味着您仍然处于算法的预期规模。

无论哪种方式,关于它的事情都不多。