0x22 深度优先搜索

0x22 深度优先搜索

深度优先搜索(DFSDepth First Search),顾名思义,就是按照深度优先的顺序对"问题状态空间"进行搜索的算法。在0x00章中,我们多次把一个问题的求解看做对问题状态空间的遍历与映射。从本章起,我们可以进一步把"问题空间"类比成为一张图,其中的状态类比为节点,状态之间的联系与可达性就用图中的边来表示,那么使用深度优先搜索算法求解问题,就相当于在一张图上进行深度优先遍历。

深度优先搜索与"递归"和"栈"密切相关。我们倾向于认为"递归"是与递推相对的一种单纯的遍历方式,除了搜索之外,还有许多算法都可以用递归实现。而"深搜"是一类包括遍历形式、状态记录与检索、剪枝优化等算法整体设计的统称。

在研究深度优先搜索算法之前,我们先来定义该过程产生的"搜索树 "结构。在对图进行深度优先遍历处于 x x x点,对于某些边 ( x , y ) (x,y) (x,y), y y y是一个尚未访问过的节点,程序从 x x x成功进入了更深层的对 y y y的递归;对于另外一些边 ( x , y ) (x,y) (x,y), y y y已经被访问过,从而程序考虑其他分支。我们称所有点(问题空间中的状态)与成功发生递归的边(访问两个状态之间的移动)构成的树为一棵"搜索树"。整个深搜算法就是就基于该搜索树完成的------为了避免重复访问,我们对状态进行记录和检索;为了使程序更加高效,我们提前减除搜索树上不可能是答案的子树和分支,不去进行遍历。

我们在0x03节中使用递归实现的指数型、排列型和组合型枚举,其实就是深搜的三种简单的形式。与之相关的子集和问题、全排列问题、N皇后问题 等都是可以用深搜求解的经典NPC问题。

相关推荐
无极低码1 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发1 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
Thera7772 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
superior tigre2 小时前
22 括号生成
算法·深度优先
君义_noip3 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
努力也学不会java3 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎3 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan4 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
顶点多余4 小时前
使用C/C++语言链接Mysql详解
数据库·c++·mysql
汉克老师4 小时前
GESP2026年3月认证C++四级( 第二部分判断题(1-10))
c++·指针·函数重载·文件操作·数组·gesp4级·gesp四级