我是靠谱客的博主 隐形白羊,最近开发中收集的这篇文章主要介绍双向BFS,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

转自“Yuan”

 

如果目标也已知的话,用双向BFS能很大提高速度

单向时,是 b^len的扩展。

双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时

至于实现上,网上有些做法是用两个队列,交替节点搜索 ×,如下面的伪代码:   

 while(!empty())

{

        扩展正向一个节点

            遇到反向已经扩展的return

        扩展反向一个节点      

            遇到正向已经扩展的return      

}

但这种做法是有问题的,如下面的图:

 

求S-T的最短路,交替节点搜索(一次正向节点,一次反向节点)时

Step 1 : S –> 1 , 2

Step 2 : T –> 3 , 4

Step 3 : 1 –> 5

Step 4 : 3 –> 5   返回最短路为4,错误的,事实是3,S-2-4-T

正确做法的是交替逐层搜索保证了不会先遇到非最优解就跳出,而是检查完该层所有节点,得到最优值 也即如果该层搜索遇到了对方已经访问过的,那么已经搜索过的层数就是答案了可以跳出了,以后不会更优的了。 当某一边队列空时就无解了。

 

优化:提供速度的关键在于使状态扩展得少一些,所以优先选择队列长度较少的去扩展保持两边队列长度平衡。这比较适合于两边的扩展情况不同时,一边扩展得快,一边扩展得慢。如果两边扩展情况一样时,加了后效果不大,不过加了也没事。

转载于:https://www.cnblogs.com/xz816111/p/4369756.html

最后

以上就是隐形白羊为你收集整理的双向BFS的全部内容,希望文章能够帮你解决双向BFS所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部