什么时候选择普通BFS而非双向BFS更合适?
普通BFS优先于双向BFS的适用场景
是的,存在不少应当优先选择普通BFS的场景,主要集中在双向BFS前置条件不满足、额外开销高于收益的几类情况:
- 目标节点不明确的搜索场景
双向BFS的前提是你提前知道明确的唯一目标节点,如果你的搜索需求是找距离起点最近的、满足某类模糊条件的节点(比如「找距离起点最近的可访问出口」「找第一个值大于100的节点」),没有固定的唯一目标节点作为反向搜索的起点,此时只能使用普通BFS逐层遍历匹配。 - 需要计算单源全最短路径的场景
如果你的需求是计算从起点出发到所有可达节点的最短路径,而非仅到单个目标节点的最短路径,双向BFS完全无法满足需求,必须使用普通BFS遍历全图得到所有节点的距离结果。 - 反向边/反向状态不可构造或构造成本极高的场景
双向BFS要求你可以同时进行正向遍历(从起点找后继节点)和反向遍历(从终点找前驱节点)。如果面对的是没有提前构建反向邻接表的有向图,或是状态转换不可逆的状态空间搜索问题(比如部分涉及不可逆操作的游戏状态、化学合成路径搜索中部分反应不可逆),构建反向遍历能力的成本远高于直接跑普通BFS的开销,此时优先选普通BFS。 - 图规模极小或目标距离极近的场景
双向BFS本身有固定的额外开销:需要维护两个队列、两个访问标记集合,还要每次迭代判断两个搜索集合是否出现交集。如果搜索的图总节点数只有几百甚至更少,或是目标节点就在起点的1-2层遍历范围内,双向BFS的额外开销会高于它节省的遍历时间,直接用普通BFS效率更高。 - 单端分支爆炸的极端场景
如果目标节点所在的一端的搜索空间分支极多、规模极大,甚至远大于整段路径的总搜索量,此时从终点启反向遍历反而会引入远高于普通BFS的开销。比如你要在一个社交网络中找某个人和一个超级明星的最短关系链,超级明星的好友数高达数千万,从明星端反向遍历第一层就会产生千万级的节点,反而不如直接从普通用户端单向BFS效率高。
补充说明:双向BFS的时间优势是理论上限为普通BFS的一半,但实际收益完全取决于图的结构和搜索场景,并不是所有两点最短路径搜索都适合用双向BFS,需要结合实际场景选择。
内容的提问来源于stack exchange,提问作者Rishi Prakash
相关产品推荐
相关产品推荐

