- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
搜索算法pascal
搜索算法讲稿
一、预备知识——树(图)的深度优先遍历(DFS)和广度优先遍历(BFS)
树的深度优先遍历(DFS)的方法实质是先序遍历这棵树:从根结点出发,沿树的纵深方向遍历,当在这个方向上不能在继续遍历的时候,退回到上层结点,选择另外一个分枝继续遍历。(相当于图的DFS)
树的广度优先遍历(BFS)的方法实质是按层来遍历这棵树:从根结点出发,访问了根结点之后访问根结点的所有子结点,然后分别从这些子结点出发,继续按广度优先的顺序遍历这棵树。(相当于图的BFS)。
例如:下面这棵树的DFS和BFS遍历顺序。
DFS遍历顺序:
V0-V1-V4-V5-V6-V2-V7-V8-V3-V9-V10-V11
BFS遍历顺序:
V0-V1-V2-V3-V4-V5-V6-V7-V8-V9-V10-V11
我们知道图的两种遍历方法,其遍历过程都有一棵生成树,所以“图”的遍历可统一到“树”的遍历。
我们还知道,图的DFS要用到“栈”(递归),图的BFS要用到“队列”。这些都是我们学习搜索算法的要用到的知识。
从结点‘A’出发两种遍历。
DFS遍历顺序 BFS遍历顺序
二、搜索算法概述
搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。搜索过程实际上是根据初始条件和扩展规则构造一棵“解答树”并寻找符合目标状态的节点的过程。所有的搜索算法从其最终的算法实现上来看,都可以划分成两个部分──控制结构(扩展结点的方式)和产生系统(扩展结点),而所有的算法的优化和改进主要都是通过修改其控制结构来完成的。
常用的搜索方法有回溯法、深度优先搜索法和广度有优先搜索法(在绝大部分的信息学奥赛辅导书籍中,将回溯算法与深度优先搜索法合在一起称为深度优先搜索算法):
深度优先搜索算法(DFS),就是按深度优先的策略,并按约束条件构造问题的解答树(如果问题给出的图是显示的,即明确地给出图中结点、边的关系,则就变成了图或树的遍历问题);
广度优先搜索算法(BFS),就是按就是按广度优先的策略,并按约束条件构造问题的“解答树”(如果问题给出的图是显示的,即明确地给出图中结点、边的关系,则就变成了图或树的遍历问题)。
由上面的叙述可以看出,搜索算法中的“解答树”是非常关键的,如果我们在运用搜索算法的时候,脑海里有这棵树,能让我们的思路清晰,给优化算法带来方便,下面我们来看如何构造问题的“解答树”。
(构造一个解)
深度优先搜索算法 可以用递归过程或者模拟递归来实现。以下是实现的两种框架:
Program深度优先搜索算法程序;
Const …;
Type …;
Var …;
Procedure try(depth:longint,…);
Var i:longint;
Begin
If depth目标深度 then begin 输出方案 ;exit end;
For i:=depth 深度可能决策范围 do begin
If 决策i 符合展开条件then begin
记录决策i ;
Try(depth+1);
删除决策i ;
End;
End;
End;
Begin
主程序读入数据并初始化;
Try(1);
程序终止化;
End.
例1、杯子分溶剂问题:有2个杯子,容量分别为x毫升、y毫升,在一个实验瓶中装有x+y毫升的化学溶剂,实验中需要将他精确地分为两份,没有量具,只用两个杯子,试设计一个程序能找出一种对分方法,若不能对分,输出‘NO!’。
分析:假设x=5、y=3,设瓶子为A,则我们将每个容器中的溶剂的数量作为状态结点,从一个容器往另一个容器中倒溶剂,表示一种状态的变化,这就是结点的“产生系统”,我们知道,每种状态可以扩展出6个分枝结点,即:
A向X倾倒溶剂:A-X
A向Y倾倒溶剂:A-Y
X向A倾倒溶剂:X-A
X向Y倾倒溶剂:X-Y
Y向A倾倒溶剂:Y-A
Y向X倾倒溶剂:Y-X
比如初始结点(8,0,0)可以扩展出的结点为:(3,5,0)、(5,0,3),后四种:X-A、X-Y、Y-A、Y-X均无法扩展出来,因此剪掉。
按照这种思路,我们可以构造出解答树如下:(访问过的结点不应在扩展,因此也要被剪掉)。
文档评论(0)