双向广度优先搜索

 📋 单队列交替扩展法

这是最早期的极简实现,将起点和终点同时放入同一个队列,正向和逆向搜索交替从队列头部取节点扩展,直到出现重复节点即终止。

✅ ‌优点‌
代码实现极其简洁,仅需维护1个队列和1个全局访问标记数组,上手门槛极低
内存占用最小,不需要额外开辟第二份队列空间
❌ ‌缺点‌
两个方向的扩展顺序完全随机,极易出现单侧搜索树快速膨胀的情况,效率不稳定
无法精准记录两个方向各自的搜索步数,路径重建逻辑非常容易出错
⭐ 推荐星级:⭐⭐☆☆☆
适用场景:仅适合状态空间极小、分支因子极低的入门级练习题。
🔍 双队列等层交替扩展法
这是最经典的常规实现,分别维护正向、逆向两个独立队列,每次完整扩展完正向的一整层节点,再切换到逆向扩展一整层,交替循环直到相遇。

✅ ‌优点‌
逻辑清晰直观,两个方向的步数独立维护,相遇时能直接通过步数相加得到最短路径长度
完全保留BFS的层序特性,天然保证最短路径的最优性,路径重建难度低
❌ ‌缺点‌
没有考虑两个方向的节点生成速度差异,若其中一侧分支因子远大于另一侧,会出现单侧队列爆炸,性能退化为接近单向BFS
固定交替的策略无法适配非完全树的场景,容易做大量无效扩展
⭐ 推荐星级:⭐⭐⭐⭐☆
适用场景:图结构对称、两个方向分支因子相近的场景,比如标准迷宫寻路、规则对称的拼图游戏。
⚖️ 优先扩展小队列动态平衡法
这是目前工业界和信奥竞赛中最常用的优化实现,每次动态比较两个队列的当前节点数,优先选择规模更小的一侧进行扩展,始终保持两个方向的搜索树规模接近。

✅ ‌优点‌
从根本上解决了两个方向扩展速度不平衡的问题,能最大化发挥双向BFS的指数级效率优势,节点扩展量通常比前两种方式少30%以上
性能表现稳定,即使在非完全树、分支因子不对称的场景下,也能避免单侧队列膨胀
❌ ‌缺点‌
实现复杂度最高,需要额外增加队列大小判断逻辑,调试时需要同时跟踪两个方向的扩展状态
极端场景下(比如其中一个方向完全没有分支),动态切换的额外判断开销会小幅抵消性能收益
⭐ 推荐星级:⭐⭐⭐⭐⭐
适用场景:几乎所有双向BFS的生产级场景,比如单词接龙、八数码问题、社交网络最短路径查询等状态空间较大的任务。

posted @ 2026-09-03 13:20  费先生  阅读(11)  评论(0)    收藏  举报