如何在无向图中加速广度优先搜索

时间:2014-03-06 18:42:06

标签: algorithm

我认为我们可以使用队列进行广度优先搜索(BFS)遍历,并且因为队列中的add()和remove()是常量时间,所以我认为BFS从起始节点遍历到目标节点是线性时间。

但如何加快BFS?有没有可以减少时间复杂度的数据结构?

2 个答案:

答案 0 :(得分:2)

您可以通过执行 bi-directional search 来加快从源到目标的BFS。

双向搜索基本上是从源和目标同时进行BFS,从每个进行一步 - 直到两个战线相遇。

为什么会更好?

  • 最坏情况下的BFS发现O(B^d)个节点(B是分支 因素,每个节点的程度) - 和d是深度 溶液
  • 最坏情况下的双向BFS会发现O(B^(d/2)*2)=O(B^(d/2))个节点 通常要小得多

根据经验,对于大/无限图,双向搜索通常比常规BFS更快。

答案 1 :(得分:-1)

最坏的情况时间是节点数的线性(并且可以清楚地获得)。您可以通过启发式方法加快搜索速度,即,不是将新节点添加到队列,而是将它们添加到优先级队列,其中优先级是衡量新节点接近目标的程度。

加快速度的另一种方法是在并行中工作,即将要处理的节点队列变为工作线程。但是你会遇到麻烦,确保不会多次访问(或至少没有太多)节点。

除非您尝试处理的图表真的很大,否则我不会过于担心这一点,在这方面没有什么可以被挤出来的。 衡量系统瓶颈所在的位置,并专注于它们。只有在表现不够的情况下才能做到这一点,否则就把时间花在海滩上(或者你喜欢做的最好的事情)。