双向广度优先搜索

摘要:
\这两个队列被判断为6 for(int i=0;10 expanded[0].insert(status);12expanded[1]insert(goalStatus);=qtail[0]&=Qtail[1])两个队列都不为空14{15intqno;//另一个队列25status=myqueue[qno][qhead[qno]]。Status;find The path matches=Status;

双向广度优先搜索

双向广度优先搜索是对广搜算法的一种扩展。广搜以起点以广度优先的顺序不断扩展,直到遇到目的节点。

而双向广搜算法从两个方向开展广搜,一个从起点,另一个从终点。

直到一个扩展队列中出现了另一个队列中已经扩展了的点,也就是说两个扩展方向出现了交点。

双向广搜相对于广搜算法来说,由于采用了双向同时扩展的方式,搜索树的宽度明显减宽,时间和空间复杂度都明显提高。

假设一个节点能扩展n个节点,扩展m层,单向广搜扩展出的数量就是    (1 - nm) ⁄ ( 1 - n )

而双向广搜同样扩展m层,总结点数为   ( 1 - nm/2) / ( 1 - n ) ,在数据范围较大的时候,优势就体现出来了

 1 void dbfs{
 2     将起点放入队列q1,目标节点放入q2
 3     while(两个队列均未空且未发现路径){
 4            如果q1中节点比q2中少,则扩展q1,否则扩展q1
 5     }
 6     if(未发现路径){
 7        如果q1未空,不断扩展q1为空或发现路径
 8        如果q2未空,不断扩展q2未空或发现路径
 9     }
10 }

现在我插入一段关于八数码问题的双向广搜代码

 1 inline bool DBFs(int status)
 2 {
 3 \寻找初始状态status到目标的路径,找不到则返回false
 4     int newstatus;
 5     set<int> expanded[2];\两个队列判重
 6     for(int i=0;i<2;i++){
 7         qhead[i]=0;qtail[i]=1;
 8     }
 9     myqueue[0][0]=Node(status,-1,0);
10     expanded[0].insert(status);
11     myqueue[1][0]=Node(goalStatus,-1,0);
12     expanded[1].insert(goalStatus);
13     while(qhead[0]!=qtail[0]&&qhead[1]!=qtail[1])\两队均不为空
14     {
15         int qno;\本次要扩展的队列
16         if(qhead[0]==qtail[0]) qno=1;
17         else if(qhead[1]=qtail[1])
18         qno=0;
19         else{//比较两队元素个数
20             if(qtail[0]-qhead[0]<qtail[1]-qhead[1])
21             qno=0;
22             else qno=1;
23         }
24         int vqno=1-qno;//另一队列
25         status=myqueue[qno][qhead[qno]].Status ;
26         if(expanded[vqno].find(status)!=expanded[vqno].end()  ){//在另一个队列扩展过,路径找到            matchings=status;
27             matchingq=qno;
28             return true;
29         }
30         else{
31             for(int i=0;i<4;i++){//尝试4种移动
32                 newstatus=New(status,move[i]); //表示移动后的新状态是否可行
33                 if(newstatus==-1)
34                 continue;//否,下一种
35                 if(expanded[qno].find(newstatus)!=expanded[qno].end() )
36                 continue;//以扩展过,则不能入队
37                 expanded[qno].insert(newstatus);
38                 myqueue[qno][qtail[qno]]=Node(newstatus,qhead[qno],moves[i]);//moves[]表示4种移动
39                 qtail[qno]++; 
40             }
41             qhead[qno]++;
42         }
43       }  
44       return false;
45 }

其中 goalstatus 为目标状态   matchings为双向碰到的状态  matchingq碰到的那个队列

-end-

强行退出函数 exit(0)

免责声明:文章转载自《双向广度优先搜索》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇正则表达式实现跨行匹配SetupDi系列函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

安装特定版本的OpenSSL

转载:https://yq.aliyun.com/articles/512132 1、下载源码包: wget http://www.openssl.org/source/openssl-1.0.2d.tar.gz     2、安装到/usr/local/ssl/目录下: tar zxvf openssl-1.0.2d.tar.gz     cd opens...

SpringSecurity中的授权

一.定义   所谓的授权,就是用户如果要访问某一个资源,我们要去检查用户是否具备这样的权限,如果具备就允许访问,如果不具备,则不允许访问。 二.准备测试用户(由于没有连接数据库)   1.基于内存配置测试用户      @Override protected void configure(AuthenticationManagerBuilder auth)...

【IDEA】项目中引入Spring MVC

一、原文说明: IntelliJ idea创建Spring MVC的Maven项目 - winner_0715 - 博客园 https://images2015.cnblogs.com/blog/824490/201703/824490-20170305211140532-283571118.png 注:自己的实操源码全在 https://github.c...

Cassandra开发入门文档第四部分(集合类型、元组类型、时间序列、计数列)

Cassandra 提供了三种集合类型,分别是Set,List,MapSet: 非重复集,存储了一组类型相同的不重复元素,当被查询时会返回排好序的结果,但是内部构成是无序的值,应该是在查询时对结果进行了排序。List: 列表,查询时会按照元素在list中的index顺序来返回结果,可以存储多个重复的值。Map:哈希Key-Value键值对,提供了名字到值的...

用Visual studio 2005打开Visual studio 2008 开发的项目

方法一参考: 1. 用记事本打开解决方案文件(扩展名为*.sln).将Microsoft Visual Studio Solution File, Format Version 10.00# Visual Studio 2008把上面这两句,改成Microsoft Visual Studio Solution File, Format Version 9....

html里面的相对路径和绝对路径

  HTML有两种路径的写法:相对路径和绝对路径。 相对路径是在同一个目录的文件引用,如果源文件和引用文件在同一个目录里,直接写引用文件名即可。 如: a.html:     c: estmenua.html b.html:      c: estmenua.html a.html中引用b.html: <a href="http://t.zoukan...