2019年4月20日

总结

上一次,我们整理了一下递归。
那么按照进度,今天我们来整理搜索。

搜索

所谓搜索,其实也是一种穷举的思想。
不过,他有了一定的方向性和目标性。
下面,我们来看看两种搜索。
广度优先搜索
首先,基本思想是:
从初始状态S 开始,利用规则,生成所有可能的状态。构成的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则。
生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。
这些东西看看就行,要理解根本没法理解。
还是直接上图比较好。
在这里插入图片描述
广度优先搜素,他的顺序在图中,就是。
由状态方程,可以由s1得到s2,3,4。
然后由s2推出s5,6,7。
接着由s3推出s9,s10。
依次类推。
他的过程为
具体过程:
1 每次取出队列首元素(初始状态),进行拓展
2 然后把拓展所得到的可行状态都放到队列里面
3 将初始状态删除
4 一直进行以上三步直到队列为空。
从ppt上复制个框架

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

深度优先搜索

搞定广度优先,接下来我们来看深度优先。
还是这张图。
在这里插入图片描述
相对于广度优先,深度优先顾名思义,就是先一条路走到黑,不行就折返。
他的流程可以解释为。
由s1推出s2,3,4。
接着,由s2,推出s5。
接着,由s5推出s13。
如果s13不符合条件。
那么返回s5,推出s14。
以此类推。
那么他的具体实现过程
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

例题

至于题目吗。。。
这次先不贴了。
我自己都没怎么搞明白?
等我把这玩意吃透了
我就写个博客发了。

感悟

其实,就最近来看。
我的学习方面可以说遇到了这样的情况
原理我理解。
例题我仔细想想能大约明白。
但是一旦到了真刀真枪做题了。
两眼蒙逼。
不知所措。
如果是和例题相似或者只是换了张皮。
我还可以凑活凑活。
但是一旦遇到稍微变化大一点。
依然是一脸懵逼。
哭了哭了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值