【笔记】 搜索

搜索包括dfs,bfs,迭代加深,启发式搜索;

一:常见搜索问题

排列,组合,路径

二:DFS

一搜搜到底;
优点:占空间小,很快找到一个解;
缺点:找的的解不一定是最优解,有超时和爆栈风险;
技巧:打暴力,卡时骗分;
例题:全排列,八皇后,floodfill;

三:BFS

基于队列,层层展开;注意判重(双哈希)
优点:解与路径长度成正比的问题中,找到的第一个解是最优解;
缺点;占空间大,stl里的队列可能慢;
例题:拓扑排序,八数码问题(判重 hash八位数字);

四:迭代加深

给dfs加一个深度限制,逐步扩大深度限制,直到找到解或无解;
速度接近bfs,空间接近dfs;应用了dfs,可以看做dfs的一种优化;
适用于当搜索深度没有明确上限的情况。
虽然搜索次数增多,但每一次搜索和下一次搜索相比较微不足道,所以整体速度不会太慢;
搜到的第一个解深度最小,一定程度上拥有bfs的优点;
例题:四子连棋;

五:启发式搜索

1.利用启发信息引导搜索,进而减小无用搜索量;
启发信息的强度
强:降低搜索工作量,但可能导致找不到最优解
弱:一般导致工作量加大,极限情况下变为盲目搜索,但可能可以找到最优解
2.评价函数 :f[n]=g[n]+h[n]
f[n]:评价值
g[n]:真实值
h[n]:估计值
h*[n]:h[n]的真实值;

A算法:估价函数不一定准确,找到的第一个解不一定是最优解;
A*算法:满足h[n]<=h*[n]
1. 在满足条件的情况下,h[n]越大,算法越优;
h[n]=0,退化为普通bfs
2.不足:有的节点可能会被扩展若干次
3.改进:对h加以限制
当h满足h(ni) - h(nj) ≤ c(ni, nj),nj是ni的子节点,h(t) = 0,则h是单调的
若h(n)是单调的,则A*扩展了节点n之后,就已经找到了到达节点n的最佳路径。
即:当A*选n扩展时,有g(n)=g*(n)。
4.例题: poj 2449

http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx

六:优化

1.剪枝:
可行性剪枝:搜不到解,剪
最优性剪枝:一定搜不到最优解,剪
技巧:有些情况倒着搜,可能更快;co 1268
poj 1011 小木棍
2.记忆化:将搜到的答案记录
例题:codevs 滑雪
3.位运算:将当前状态用01序列表示;
技巧:bitset<233> x 开一个二进制233位的变量x
4.判重:
hash
map 慢,,不推荐

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值