搜索学习笔记
搜索#
重要性#
搜索是一个很好锻炼代码能力的算法,学好搜索,能很好的理解dfs、bfs等,有利于别的算法(图论即与树相关的问题)的实现
关键#
明确当前给你的状态,你需要什么才能往下搜
明确操作是什么
事先思考怎么搜合适,即怎么搜会更快,不要碰到题就开始搜,剪枝也最好在写题前写好想好,剪枝放在一起放在最前面(方便检查修改)
状态:指当前所面临的问题的信息,如当前的位置等信息
转移:指从一个状态到另一状态的一种决策
我们从问题中寻找状态与转移方法!
实质#
一棵树或图
根为其实节点
某些满足终止条件的叶子为终止节点
要求一条满足条件的路径
思考顺序#
- 从题目确定状态,目标
- 从题目确定决策,即每一步做什么
- 列出基本的框架,思考状态、决策能否简化
- 剪枝,最优化,可行性
可行性剪枝:判断当前位置能否到T
最优性剪枝:若
若
迭代加深搜索#
搜索前设立一个
若
搜索失败则加大
本质上是深搜和广搜的互补
深搜对于一些答案很浅的问题有时候效率很低
广搜则需要大量的空间,以及难以剪枝
迭代加深搜索则兼具两者的优点
记忆化搜索#
我们一般写的动态规划是bfs模式的,即一个点从与它相邻的点转移过来
如果用深搜写动态规划,就可以说是记忆化
基本思路:
对于每个状态,存储该状态返回信息
以后再到该状态,直接调用存储信息即可
记忆化搜索是另一种动态规划,按划分应该分在动态规划里面,即它的复杂度是确定的
但其优点是很容易想到,思考难度较低,本质上是搜索再加上几行记忆化即可
先考虑搜索怎么搜,再加上记忆化
启发式搜索#
事情开始逐渐不对起来。。
令
找到最优解即找到一个启发式函数值最小的终止状态
这东西我就没见有人用过
折半搜索#
如果已知起点和终点,可以考虑从起点和终点一起搜,这样可以把指数上的
主要思想:
两个人分别从
当他们都走了
找到了长度为
双向BFS
从起始状态和目标状态同步BFS,直至交汇。
理论上可以将访问到的状态数开根号
优化方法#
一般先考虑消耗较大的决策(类似于先贪心,利用最优性剪枝来加快搜索速度)
如果问题可以分为多个互不相同的子问题,先考虑状态量少的子问题
如果搜索的状态与数值排列的顺序无关,可以考虑把数值排序,在有HASH判重的情况下,这样一般可以再减少一个阶乘的复杂度
作者: 北烛青澜
出处:https://www.cnblogs.com/Multitree/p/16758494.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通