首页 > 其他分享 >搜索 学习笔记

搜索 学习笔记

时间:2024-02-29 10:26:23浏览次数:23  
标签:剪枝 终点 迭代 dfs 学习 搜索 笔记 双向

目录

  1. 最基础的搜索

    1.1 bfs

    1.2 dfs

  2. 双向搜索

    2.1 双向广搜

    2.2 双向宽搜

    2.3 meet in the middle

3 搜索的优化

3.1 记忆化搜索

3.2 最优性剪枝

3.3 可行性剪枝

3.4 其他方法

  1. 迭代加深搜索

  2. Dancing Links

  3. \(\alpha - \beta\) 剪枝

  4. A/IDA

正文

1. 最基础的搜索

bfs/dfs 无需多言。bfs 瓶颈在于空间,dfs 瓶颈在于递归的时间。

2. 双向搜索

2.1 双向广搜/2.2 双向宽搜

从起点或终点同时进行搜索。

对于广搜,具体地说,给每个点带上从起点/终点转移而来的标记,同时丢进队列里面即可。

对于深搜,感觉好像没啥用。

2.3 meet in the middle

通常发现一个复杂度刚好是 \(O(a^b)\) 时,就可以把搜索分成两半合并,优化为 \(O(a^\frac b 2)\)。

例题1:

P2962

先做一半然后丢进 map,然后在做后一半的时候对前一半的方案进行计数。复杂度 \(O(2^\frac n 2)\)。

例题2:

一个 \(n\times n\) 的网格图,点有点权 \(\in(0,1)\),求从地图左上走到地图右下经过的路径是回文串的方案数。\(n\le 20\)。

显然先从左上搜到 \((x,n-x)\),然后从终点搜过去就行了。\(O(2^\frac n2 n)\)。

3. 搜索的优化

3.1 记忆化搜索

具体的,如果函数为 dfs(i,j,k) ,那么可以设 \(f_{i,j,k}\) 表示 \(dfs(i,j,k)\) 的答案,每次如果遍历过直接取答案,大大优化复杂度。

3.2 最优性剪枝

如果当前答案加上剩余的最优解(不考虑合法情况)都小于当前的最优解,则不继续搜索。

3.3 可行性剪枝

如果已经不合法,不进行搜索。

3.4 其他方法

调整法/讨论极端情况/数学方法。或许可以考虑改变搜索的状态。

4. 迭代加深搜索

限制迭代层数。但可能搜不出最优解。

咕。

6. \(\alpha - \beta\) 剪枝

咕。在 ACM 中感觉很常见啊。

7. A*/IDA*

引自 oi-wiki

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

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

如果 \(h\leq h*\),则 A* 算法能找到最优解。

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

`IDA* 即为采用迭代加深的 A* 算法。

标签:剪枝,终点,迭代,dfs,学习,搜索,笔记,双向
From: https://www.cnblogs.com/lgh-blog/p/18042784

相关文章

  • 机器学习策略篇:详解满足和优化指标(Satisficing and optimizing metrics)
    满足和优化指标要把顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,发现有时候设立满足和优化指标是很重要的,让我告诉是什么意思吧。假设已经决定很看重猫分类器的分类准确度,这可以是\(F_1\)分数或者用其他衡量准确度的指标。但除了准确度之外,还需要考虑运行时......
  • 分块 学习笔记
    目录分块思想分块基础操作2.1\(O(\sqrtn)-O(\sqrtn)\)区间加、区间查询2.2\(O(1)-O(\sqrtn)\)区间加、单点查询2.3\(O(\sqrtn)-O(1)\)单点加、区间查询各种分块思路3.1对序列分块普通区间和维护区间\(k\)大等3.2对值域分块3.3对操作分块3.......
  • 简单字符串 学习笔记
    目录字符串哈希字典树字典树的倒序建树KMP正文1.字符串哈希1.1基础可以在数字和字符串之间快速转化。考虑一个哈希函数:\(f(s)=(\sum\limits_{i=0}^{n}s_i\timesbase^{n-i+1})\)。容易发现这些值是唯一的。但是取模时需要选一个较大模数,减少冲突概率。cons......
  • RASP部署笔记
    一.什么是RASPRASP全称是RuntimeApplicationSelfProtect,其基本思路是将防护代码注入到应用运行的关键函数中,实现应用运行态的入侵检测与防护。例如,为了检测任意文件上传攻击,我们可以将防护代码注入到文件写入基础函数中。在java中,这个函数是FileOutputStream的构造函数。我们通......
  • 基于MATLAB深度学习工具箱的CNN卷积神经网络训练和测试
    一、理论基础    为了尽可能详细地介绍基于MATLAB深度学习工具箱的CNN卷积神经网络训练和测试,本文将按照以下内容进行说明:CNN卷积神经网络的基本原理深度学习工具箱的基本介绍CNN卷积神经网络训练的步骤和方法CNN卷积神经网络的优缺点1.CNN卷积神经网络的基本原理 ......
  • MatLab深度学习
    1.深度学习介绍公司官网有个很好的深度学习(DeepLearning)介绍文档。他们在视频中对深度学习的解释就是:DeepLearningisamachinelearningtechniquethatlearningfeaturesandtasksdirectlyfromdata.深度学习是机器学习的一种,从数据中直接学习特性和功能。深度学习......
  • 《系统科学方法概论》第三章读书笔记
    读完《系统科学方法概论》的第三章后,我对系统科学方法有了更深入的理解和认识。这一章介绍了系统分析方法,让我明白了如何从整体的角度去理解和研究复杂的系统。系统分析强调对系统的各个组成部分进行全面的考察,并考虑它们之间的相互关系。这种方法帮助我更好地把握系统的本质和特......
  • 《系统科学方法概论》第四章读书笔记
    读完《系统科学方法概论》的第四章后,我对系统分析方法有了更深入的理解和认识。这一章详细介绍了系统分析的概念、步骤和方法,让我明白了系统分析在解决复杂问题中的重要性。通过对系统的各个组成部分进行分解和分析,我们可以更好地理解系统的整体行为和特性。我认识到系统分析需......
  • 《系统科学方法概论》第五章读书笔记
    读完《系统科学方法概论》的第五章后,我对系统分析方法有了更深入的理解和认识。这一章详细介绍了系统分析的概念、步骤和方法,让我明白了系统分析在解决复杂问题中的重要性。通过对系统的各个组成部分进行分解和研究,我们可以更好地理解系统的整体行为和特性。我认识到系统分析需......
  • Linux学习-day6
    问题回顾ssh登录Linux服务器默认有7个终端,按Ctrl+alt+F1~F7可以进行切换;SSH远程登录服务器Windows下命令写法:[email protected](端口不写默认是22)Linux下命令写法:[email protected]关于登录与退出登录登录系统[email protected]退出登录exit......