- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
大家一起来广搜.docx
谢家晔大家一起来广搜
从DFS说起……
广度优先搜索与深度优先搜索在控制结构和产生系统上都很相似(控制结构——状态搜索树;产生系统——状态转移规则)。不同点在于对节点的扩展顺序不同,因而采用了不同的数据结构实现。因此,这两种算法在性能和适用范围上有较大区别。
如可行解问题用深搜来解决,而最优解问题用广搜来解决。
另外,由于深度优先搜索一般用递归实现,调用栈的层数限制也在一定程度上限制了适用的问题规模。
以下就给大家介绍一下广度优先搜索算法及其优化。
主要内容
广搜的基本概念
广搜的基本操作(队列实现)
广搜的优化
广搜的应用
搜索的基本概念
状态
对问题在某一时刻进展情况的数学描述。我们将一个状态简化为一个节点处理。
状态转移
问题从一种状态到转移到另一种(或几种)状态的操作。
状态空间
问题可以处于的所有状态。
搜索树
将初始状态作为根节点,由状态转移操作扩展出其他节点作为其子节点,并对其他节点按一定规则重复同样的操作,得到的一个树结构。
广度优先搜索的思想
刚才我们在搜索树中提到“对其他节点按一定规则重复同样的操作”。
在广搜中,这个规则即为按层遍历。
即:从根节点(第0层)开始,依次扩展完该层的所有节点,再扩展下一层的节点。
由此可知,广搜可以用来解决最少步数的问题:同一层的步数都是相等的(都等于层数),而每次都是搜完较浅层的才搜较深层的,因此最先搜索到的解一定是最少步数的解。
广度优先搜索的基本操作
从初始节点开始,按一定规则扩展出第一层的若干个节点,同时检查目标节点是否出现在这些节点中;
若没有,再按规则将第一层节点依次扩展出第二层节点,并逐一检查目标节点是否出现在这些节点中;
以此类推,直至出现目标节点为止;若扩展完所有的节点后目标节点都未出现,则问题无解。
示例搜索树的广度优先遍历顺序为:V1;V2,V3;V4,V5,V6
第2层
第1层
第0层
V1
V2
V4
V5
V3
V6
广度优先搜索的基本操作
首先我们来熟悉一下队列这个数据结构。
1.它是一个线性表。
2.我们只能操作队头和队尾的元素。因此有了头指针和尾指针。
3.Last but not least… 队列是一个先进先出(FIFO, First In First Out)的线性表,这是它最重要的性质。即:新进队的元素只能加在队尾,而出队的必须是队头元素。
…
v1
v2
v3
v4
…
广度优先搜索的基本操作
现在我们来看广搜与队列的关系:
由广搜扩展节点的顺序可知,应当用先进先出的队列实现。初始时队列仅包括初始节点,每次以队头节点作为父节点扩展,扩展出的子节点入队,已扩展出所有子节点的父节点出队。另外,对于已经进过队的状态,应进行标记以避免重复搜索。
伪代码如下:
Initialize(queue)
while (!empty_queue)
state - queue_front
push every possible state extended from current state
pop current state
Poj 2882 Food cubes
给定三维空间内若干个单位立方体的坐标,求这些立方体围成了多少个空穴。空穴指在空间的6个方向被包围的连续空间。坐标范围在1~100之间。
典型的搜索题,不过用深搜的话,100^3层调用栈是会爆的=_=|||
所以……
由于数据范围不大,简单的广搜就可以过。O(∩_∩)O~
每次搜索连续空间,搜到队列为空时空穴数+1.此题还有一个需要处理的细节就是外围不被包围的空间是不算在空穴里的。我的处理方法是在最外围包一层立方体,最后将空穴数-1.
Let’s turn to BFS!
以下为伪代码…
Input initialize //create a wall outside the //whole space
For every (i, j)
initialize map[i][j] //record if (i, j) can be visited
ans - 0
For every unvisited (i, j)
BFS(i, j) //extend from (i, j) to the largest hole
ans++
ans--
Output(ans)
广搜的优化
广搜的平均时间复杂度是平均搜索到的状态数的常数倍,最坏时间复杂度是所有可能搜索到的状态数的常数倍。
因此,广搜的优化方法比较有限,主要是从减少平均搜索到的状态数入手。
且优化后不能改变解的性质,仍然要得到最优解。
广搜的优化
一种效率比较高、但适用范围较窄的优化就是双向广搜,它有效地
文档评论(0)