acm-搜索

搜索

 

一、广度优先搜索(BFS)

 

基本思想:从初始状态S 开始,利用规则,生成所有可能的状态。构成的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则。

 

生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。

 

在路径的寻找问题上用得比较多

 

具体过程:

1 每次取出队列首元素(初始状态),进行拓展

2 然后把拓展所得到的可行状态都放到队列里面

3 将初始状态删除

4 一直进行以上三步直到队列为空。

 

框架:

While Not Queue.Empty ()

Begin

可加结束条件

Tmp = Queue.Top ()

从Tmp循环拓展下一个状态Next

 

If 状态Next合法 Then

Begin

生成新状态Next

Next.Step = Tmp.Step + 1 

Queue.Pushback (Next)

End

Queue.Pop ()

End

 

 

 

二、深度优先搜索(DFS)

 

基本思想:从初始状态,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生成新状态节点),当它仍不是目标状态时,回溯到上一层结果,取另一可能扩展搜索的分支。采用相同办法一直进行下去,直到找到目标状态为止。

 

 

 

具体实现过程

1 每次取出栈顶元素,对其进行拓展。

2 若栈顶元素无法继续拓展,则将其从栈中弹出。继续1过程。

3 不断重复直到获得目标状态(取得可行解)

    或栈为空(无解)。

 

框架:

 

①:递归实现:

Function Dfs (Int Step, 当前状态)

Begin

可加结束条件

从当前状态循环拓展下一个状态Next

If 状态Next合法 Then

Dfs (Step + 1, Next ))

End

②:非递归实现:

While Not Stack.Empty ()

Begin

Tmp = Stack.top()

从Tmp拓展下一个未拓展的状态Next

If 

没有未拓展状态(到达叶节点) Then

Stack.pop() 

Else If 状态Next合法 Then

Stack.push(Next)

End

 

 

三、两者实现方式对比

  深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:

把根节点压入栈中。

每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。

找到所要找的元素时结束程序。

如果遍历整个树还没有找到,结束程序。

  广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:

把根节点放到队列的末尾。

每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。

找到所要找的元素时结束程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值