170 likes | 315 Views
搜索. 陈皓. 搜索. 搜索与其他算法不同,是一种相当“万能”的方法,使用要求非常低 相对的,最坏情况下的效率常常是指数级的 没有其他思路时,这是一种最常见的、好写的拿分方法. 搜索. 搜索的目的是从状态空间(树、图 … )中找到所需要的状态. 状态树. 两种遍历方式. 深度优先搜索( DFS ). 经典问题:八皇后问题. 如何能够在 8×8 的国际象棋棋盘上放置八个 皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线 上 统计摆放方案数,两种方案不同当且仅当棋盘上标号不同,不考虑旋转等情况.
E N D
搜索 陈皓
搜索 • 搜索与其他算法不同,是一种相当“万能”的方法,使用要求非常低 • 相对的,最坏情况下的效率常常是指数级的 • 没有其他思路时,这是一种最常见的、好写的拿分方法
搜索 • 搜索的目的是从状态空间(树、图…)中找到所需要的状态
两种遍历方式 • 深度优先搜索(DFS)
经典问题:八皇后问题 • 如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上 • 统计摆放方案数,两种方案不同当且仅当棋盘上标号不同,不考虑旋转等情况
NOIP2009 靶形数独 • Dancing Links?! • 搜索树剪枝 • 从选择少的格子开始搜 • 可行性剪枝 • 提高运算速度 • lowbit
两种遍历方式 • 广度优先搜索(BFS)
经典问题:八数码问题 • 在3×3的棋盘上,有8个数,分别是1,2,3,4,5,6,7,8 和一个空格,给定一个初始状态和目标状态,如图 • 问,给定状态至少经过几次变换才能到达目标状态。每次变换是指把空格上下左右其中的一个数移到空格处。
加速:双向广搜 • 用两个队列从初始与目标状态轮流扩展新结点,直到两边都搜索到同一个状态,就找了一条从初始到目标的路径。
迭代加深搜索 • 搜索时限制搜索树的深度,不断增加搜索树深度 • 适合搜索树又深又宽、但是解并不是很深的情况 • 重复搜索的时间可以忽略
NOIP2002 字串变换 • 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则):A1$ -> B1$A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$、A2$ 可以变换为 B2$ …。 例如:A$='abcd'B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为: ‘abcd’->‘xud’->‘xy’->‘xyz’ 共进行了三次变换,使得 A$ 变换为B$。 • 若在 10 步(包含 10步)以内能将 A$ 变换为 B$ ,则输出最少的变换步数;否则输出"NO ANSWER!"
记忆化搜索 • 例题:n个事件,每个事件有一个确定的占用时间以及它的价值,同一时刻只能处理一个事件,问能获得的最大价值。
暴力搜索? • 按开始时间排序,按顺序枚举是否选择此事件 • 重复搜索!
记录已搜索状态 • 已经搜过的结点,无需重复搜索
参考资料 • 维基百科:搜索、树、状态空间、八皇后问题 • NOIP 2002,2009 • Jon Kleinburg, ÉvaTardos, Algorithm Design