我的意思是“非常大的图形”是每个顶点有1000个相邻的顶点,但如果你去看最终的解决方案,从A到B的距离只有6(比方说)。
在这种情况下,使用基本的BFS算法会浪费掉,因为它会放置A的所有1000个相邻顶点,然后在下一轮中为每个顶点1000等等等等等等。 1000 ^ 6个顶点..
任何想法如何优化?或者更确切地说是有办法吗?
答案 0 :(得分:8)
一件容易的事就是从两个方向开展工作:
在每个步骤中,执行以下操作:
如果图形很大但高度连接,那么你将以这种方式节省相当多的空间,但它确实需要一些额外的时间来比较邻居集。
答案 1 :(得分:1)
您可以更改BFS以使用Dijkstras算法。 BFS和Dijkstras在某些方面是相关的,因此这种修改应该是可以接受的。由于这是一个电话屏幕,他们希望你有很多机会看到那里的关系。
答案 2 :(得分:1)
我同意,
这是一个有趣的问题。据我所知,有两件事可能会对你有所帮助:
同时向前和向后搜索。如果你的真实度最低为1000,那么你需要在BFS的第d次迭代中研究1000 ^ d个节点。这有效地将1000 ^(2d)减少到2 * 1000 ^ d。
在某些时候,BFS在内存消耗方面会过于昂贵。为了避免这种情况,你可以切换到'迭代深化':通过深度优先搜索(限制为1次迭代)然后进行DFS(限制为2次迭代)等来模拟BFS。开销是一个小常量(当然,这当然是这是不可取的),但这样你就可以避免出现内存问题,同时按照与BFS相同的顺序发现节点。
答案 3 :(得分:0)
两件事之一是真的:
这1000个顶点经常被共享,这意味着一旦它们在第1轮被发现,它们将在第2轮被忽略,从而大大降低你的搜索范围,
OR
这1000个顶点是唯一的,意味着您有数百万或数十亿个节点,这意味着您仍然处于算法的预期规模。
无论哪种方式,关于它的事情都不多。