搜索总结(不包含DFS和BFS)

搜索的总结:

双向搜索

双向同时搜索

双向同时搜索的基本思路是从状态图上的起点和终点同时开始进行 广搜 或 深搜。如果发现搜索的两端相遇了,那么可以认为是获得了可行解。

meet in the middle

它适用于输入数据较小,但还没小到能直接使用暴力搜索的情况。

主要思想是将整个搜索过程分成两半,分别搜索,最后将两半的结果合并。

暴力搜索的复杂度往往是指数级的,而改用 meet in the middle 算法后复杂度的指数可以减半,即让复杂度从
O ( a b ) O(a^b) O(ab) 降到 O ( a b / 2 ) O(a^b/2) O(ab/2)

启发式搜索

基于已有的信息对搜索的每一个分支选择都做估价,进而选择分支。简单来说,启发式搜索就是对取和不取都做分析,从中选取更优解或删去无效解。

A*

算法(英文:Asearch algorithm,A读作 A-star),简称 A*算法,是一种在图形平面上,对于有多个节点的路径求出最低通过成本的算法。它属于图遍历(英文:Graph traversal)和最佳优先搜索算法(英文:Best-first search),亦是 BFS 的改进。

定义起点 s s s,终点 t t t,从起点(初始状态)开始的距离函数
g ( x ) g(x) g(x),到终点(最终状态)的距离函数 h ( x ) h(x) h(x),h∗(x)1,以及每个点的估价函数 f ( x ) f(x) f(x) = g ( x ) g(x) g(x) + h ( x ) h(x) h(x)

A*算法每次从优先队列中取出一个 最小的元素,然后更新相邻的状态。

如果 h ≤ h ∗ h≤h∗ hh,则 A*算法能找到最优解。

上述条件下,如果 h h h 满足三角形不等式,则 A*算法不会将重复结点加入队列。

h = 0 h = 0 h=0时,A*算法变为 DFS;当 h = 0 h = 0 h=0 并且边权为1时变为BFS。

迭代加深搜索

简介

代加深是一种 每次限制搜索深度的 深度优先搜索。

它的本质还是深度优先搜索,只不过在搜索的同时带上了一个深度 d d d
,当 d d d达到设定的深度时就返回,一般用于找最优解。如果一次搜索没有找到合法的解,就让设定的深度加一,重新从根开始。

既然是为了找最优解,为什么不用 BFS 呢?我们知道 BFS 的基础是一个队列,队列的空间复杂度很大,当状态比较多或者单个状态比较大时,使用队列的 BFS 就显出了劣势。事实上,迭代加深就类似于用 DFS 方式实现的 BFS,它的空间复杂度相对较小。

当搜索树的分支比较多时,每增加一层的搜索复杂度会出现指数级爆炸式增长,这时前面重复进行的部分所带来的复杂度几乎可以忽略,这也就是为什么迭代加深是可以近似看成 BFS 的。

IDDFS(int u,int depth)
{
	if(depth > limit)
		return ;
	else 
		for each (u, v)
			IDDFS(u, depth + 1)
	return ;
	}

IDA迭代加深A

采用迭代加深的 A算法。相对于 A算法,由于 IDA改成了深度优先的方式,所以 IDA更实用:

  1. 不需要判重,不需要排序;
  2. 空间需求减少。

回溯搜索

这是一个常被用在DFS和BFS中的一个技巧,通过构造搜索树的方式进行遍历

dancing links

精准覆盖算法,因为可能用到十字链表的写法,所以(我也不会)

搜索的优化(剪枝)

最常用的剪枝有三种,记忆化搜索、最优性剪枝、可行性剪枝。

记忆化搜索

相同的传入值带来相同的解

最优性剪枝

每次只搜索比当前结果更好的结果

可行性剪枝

当前解不可行时舍去

具体的搜索要看不同的题目具体的分析,但是搜索的过程大同小异,熟能生巧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shirandexiaowo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值