Commit 272922d9 authored by Haoshen Zhong's avatar Haoshen Zhong Committed by Trisolaris HD
Browse files

Update search (#1163)

* Update dfs.md

* Update bfs.md

* Update astar.md

* Update idastar.md

* Update optimization.md

* Update index.md
parent 066cd710
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -50,9 +50,9 @@

所谓 **meet-in-middle** , 就是让 dfs 的状态在中间的时候碰面。我们知道,如果一个暴力 dfs 有 $K$ 个转移,那么它的时间复杂度(大多数情况)是 $O(K^N)$ 的。那我们就想,当 $N$ 到达一定程度时,TLE 会变成必然。

例题[luogu P2962\[USACO09NOV\]灯 Lights](https://www.luogu.org/problemnew/show/P2962)
例题 [Luogu P2962\[USACO09NOV\]灯 Lights](https://www.luogu.org/problemnew/show/P2962)

我们正常想,如果这道题暴力 dfs 找开关灯的状态,时间复杂度就是 $O(2^{35})$ , 显然超时。不过,如果我们用 **meet-in-middle** 的话,时间复杂度将会变为 $O(2^{18} \times 2)$ 而已。 **meet-in-middle** 就是让我们先找一半的状态,也就是 $1$ 到 $mid$ ( $N$ 的一半)的状态,再找剩下的状态就可以了。我们把前半段的状态全部存储在 $hash$ 表或者 $map$ 里面,然后在找后半段的状态的时候,先判断后半段是不是都合法,就可以判断上半段有没有配对的上半段使得整段合法。
我们正常想,如果这道题暴力 DFS 找开关灯的状态,时间复杂度就是 $O(2^{35})$ , 显然超时。不过,如果我们用 **meet-in-middle** 的话,时间复杂度将会变为 $O(2^{18} \times 2)$ 而已。 **meet-in-middle** 就是让我们先找一半的状态,也就是 $1$ 到 $mid$ ( $N$ 的一半)的状态,再找剩下的状态就可以了。我们把前半段的状态全部存储在 $hash$ 表或者 $map$ 里面,然后在找后半段的状态的时候,先判断后半段是不是都合法,就可以判断上半段有没有配对的上半段使得整段合法。

## 经典题目

+1 −1
Original line number Diff line number Diff line
## 前言

dfs(即 深搜)是一种常见的算法,大部分的题目都可以用 dfs 解决,但是大部分情况下,这都是骗分算法,很少会有爆搜为正解的题目。因为 dfs 的时间复杂度特别高。(没学过 dfs 的请自行补上这一课)
DFS(深度优先搜索)是一种常见的算法,大部分的题目都可以用 DFS 解决,但是大部分情况下,这都是骗分算法,很少会有爆搜为正解的题目。因为 DFS 的时间复杂度特别高。(没学过 DFS 的请自行补上这一课)

既然不能成为正解,那就多骗一点分吧。那么这一篇文章将介绍一些实用的优化算法(俗称“剪枝”)。

+3 −3

File changed.

Contains only whitespace changes.

+2 −2

File changed.

Contains only whitespace changes.

+1 −1

File changed.

Contains only whitespace changes.

+1 −1

File changed.

Contains only whitespace changes.

Loading