underthetwilight

搜索

\(1.前言\)

\(2.DFS\&BFS\)

\(1.\)定义:

\(DFS(Depth-First\) \(Search)\) 即深度优先搜索,\(BFS(Breadth-First\) \(Search)\) 即广度优先搜索

\(2.DFS和BFS\)的核心区别:搜索策略的区别,\(DFS\)为从一个点沿一条链(在搜索树上)搜索,\(BFS\) 为从一点向外扩散

$3.DFS's$ $code$ 以全排列为例
void dfs(int x){
	if(x==n+1) return;
	for(int i=1;i<=n;i++){
		if(b[i]==1) continue;
		else{
			a[x]=i;b[i]=1;
			dfs(x+1);b[i]=0; 
		}
	}
}
$4.BFS's$ $code$ 以$BFS$求最短路(边权全为$1$)为例
void BFS(int s){
    queue<int> q;q.push(s);
    dis[s]=0;vis[s]=1;
    while(!q.empty()){
    	int u=q.front();q.pop();
     	for(auto y:e[u]){
   			if(vis[y]) continue;
    		dis[y]=min(dis[u]+1,dis[y]);
    		q.push(y);vis[y]=1;
		}
	}
}

注:下列代码如无特殊说明,均以P1379八数码难题为例

\(3.双向BFS\)

\((1)\)原理 :

BFS1

从起始点\((Start)\)和终点\((End)\)同时\(BFS\)直到出现交点,如\(Pass\)点 停止\(BFS\)

\((2)\) 时间复杂度分析:

不妨设一棵搜索树有\(k\)层,那么一遍\(BFS\)的复杂度是\(\sum_i^k2^i\),而双向\(BFS\)的时间复杂度为\(2\sum_i^{\frac{k}{2}}2^i\)\(k\)较大时优化效果显著

$Code$ ```cpp ```

\(4.\) \(迭代加深搜索(IDFS)\)

\((1).\) 特性及用途

在正常的\(dfs\)中,我们容易进入错误的搜索树子树,然后浪费大量时间,于是我们采取类广搜的搜索方式,在单次搜索中如果递归到某一层数\(k\)就结束搜索

\((2).\) 算法原理及实现

在外侧枚举层数限制\(limit\),在搜索中若深度到达\(limit\)就结束搜索

\((3).\) 时间复杂度

算法时间复杂度的主要争议在\(limit\)更新后,我们仍要遍历整棵树,假设这是一棵\(k\)叉树那么他的第\(t\)层有\(k^t\)个节点,\(idDFS\)的状态数为\(T=\sum_i^tk^i\),在\(k>2,T\le2\times k^t\)\(k\rightarrow+\infty\)时,\(T\rightarrow k^t\)

\((4).\)优点

\(idDFS\)同时结合了\(DFS\)节省空间和\(BFS\)便于统计步数的优点

$(5).$ $Code$

\(5.启发式搜索(A^*)\)

\((1).\)算法原理:

\(Dijkstra\)算法中我们采取按最短路排序的方法,贪心的求解,我们考虑类似的操作,引入估价函数\(h(x)\)表示估计的\(x\)到终点的步数,将\(g(x)+h(x)\)作为排序的标准
估价函数\(h(x)\):应具有以下特性
\(1.\)可采纳性:假设从\(x\)到终点实际最优解为\(t(x)\),那么有\(0\le h(x)\le t(x)\)
\(2.\)\({|h(x)-t(x)|}\)越小时,算法效率越高,当\(h(x)=0\)时,退化为朴素\(BFS\)

\(6.启发式迭代加深搜索(IDA^*)\)

即在迭代加深搜索的基础上加入估价函数

if(nowstep+h()<=limit) A_star(......);

\(Tips:\) \(A*\)\(IDA*\) 的时间复杂度完全取决于\(h\)的写法,有时候玄学乘系数可以极大加快算法速度,但要把控好量,如果系数过大可能导致失去正确性,例如在骑士精神这道题中,如果将估价函数\(h\)乘系数\(2\)可以将速度从\(872ms\rightarrow 45ms\)但只能拿到\(40pts\)

\(7.搜索中的剪枝\)

\(剪枝\begin{cases} 最优性剪枝:如果当前答案继续搜索必不可能优于现有答案,停止 \\ 可行性剪枝:若当前答案违反限制或不可行,结束搜索 \\ 优化搜索顺序:原则:让搜索树变窄(使剪枝更有效)\\ \end{cases}\)

posted on 2026-05-31 16:36  Underthetwilight  阅读(6)  评论(0)    收藏  举报

导航