[王道考研计算机机试指南--专题训练]Chapter6搜索

知识清单

基础预备知识:BFS,DFS
BFS(广度优先搜索):一般依托与队列来实现,常见的包括分支限界法(分支限界中一般采用优先搜索,即采用优先队列来进行不同层间结点的扩张)。
DFS(深度优先搜索算法):一般依托于递归调用来实现,常见的应用有回溯法枚举、图的遍历。回溯法中包括子集树(8皇后)和排列树(旅行商问题)两类问题,一般DFS更加的常用。图的遍历中主要应用有Flood Fill,可以应用在图像处理领域。
对比:
BFS利用队列先进先出的特性来实现较早得到的状态较先扩展,因此搜索到的解带有最优的特性。而DFS缺少了BFS中按照层次递增顺序遍历的特性,所以其求解的问题一般不具有最优的特性,而常见于判断有没有解或者有几个解之类的问题。

1.BFS(广度优先搜索)

关键字:
  • 状态:对问题中的状态进行建模,一般需要定义相关的结构体用于表示某个结点的状态
  • 状态扩展方式:逐层扩展,对于每一个结点只进行一次扩展,且一次扩展其所有的子节点
  • 有效状态:可以进行扩展的状态,一般由题目所给条件以及相关接下进行限制
  • 队列:用于实现逐层扩展的数据结构
  • 标记:一般用于标记某些状态是否已经访问过,避免重复访问,常用布尔型数据进行表示
  • 最优:BFS常用来解决最优值问题,因为其搜索状态总是按照某个关键字进行递增。一旦出现 最少、最短、最优等搜索问题一般要考虑BFS

习题:
胜利大逃亡 (九度 OJ 1456)(BFS)
非常可乐(这道题可以转化为数论的问题,思路清奇,可以求得一个通解,见此博客)

2.DFS(深度优先搜索)

关键字:
  • 状态:对问题中的状态进行建模,一般不需要定义相关的结构体,而只需把它作为递归调用函数的形参用于表示本次调用的状态,其状态由每一层的递归调用栈进行存储
  • 状态扩展方式:逐路径扩展,一条路走到底。对于每一个结点可能多次扩展其子节点
  • 有效状态:可以进行扩展的状态,一般由题目所给条件以及相关接下进行限制
  • 堆栈:一般采用递归调用的方法进行实现,需要用到递归栈,因此递归调用的层数不能太深,要防止栈溢出的发生
  • 无需标记:无需而外的标记,由于递归和循环的特性,已经扩展完的结点不会被重复扩展,无需采用额外的存储空间进行状态的标记
  • 不具有最优特性:DFS缺少了BFS中按照层次递增顺序遍历的特性,所以其求解的问题一般不具有最优的特性,而常见于判断有没有解或者有几个解之类的问题

DFS主要涉及到递归调用,常应用于两类问题①回溯枚举②图的遍历

习题:
Prime ring problem (九度 OJ 1459)(回溯枚举)
Oil Deposit(九度 OJ 1460)(dfs图的遍历)
全排列(九度OJ1120)(回溯法,排列树)

综合应用:
Temple of the bone(九度 OJ 1461)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值