数据结构与算法(三) 深度优先搜索 上

简介: 数据结构与算法(三) 深度优先搜索

前言


本篇文章首先来学习深度优先搜索算法(Depth-First-Search,DFS)


目录


1、本质

2、核心

3、框架

4、例题


正文


1、本质


深度优先搜索,又称为回溯法,其本质就是遍历整个搜索空间,找到给定问题的解


通俗来说就是暴力搜索,只是在这个过程中也有很多值得注意的地方



下面以树的深度优先搜索为例,先来直观上理解整个执行过程


顾名思义,深度优先的意思就是先选一条路走到底,走到无路可走就进行回溯(不撞南墙不回头)


7344870d57be4619937e6426fbd2cd83.jpeg

具体遍历步骤如下:

当前节点 理想可选路径 实际可选路径 执行操作 实际选择路径
1 2 (未走)、3 (未走) 23 深入 2
2 4 (未走)、5 (未走) 45 深入 4
4 7 (未走)、8 (未走) 78 深入


7 / / 回溯


4 7 (已走)、8 (未走) 8 深入


8 / / 回溯


4 7 (已走)、8 (已走) / 回溯


2 4 (已走)、5 (未走) 5 深入


5 9 (未走) 9 深入


9 / / 回溯


5 9 (已走) / 回溯


2 4 (已走)、5 (已走) / 回溯


1 2 (已走)、3 (未走) 3 深入


3 6 (未走) 6 深入


6 / / 回溯


3 6 (已走) / 回溯


1 2 (已走)、3 (已走) / 结束



2、核心


深度优先搜索可以用递归实现,其中有几个核心概念:路径、选择列表、结束条件、约束条件

该怎么理解呢?假设我们现在站在某一个决策节点上(决策节点可以理解成上述树的节点):


路径  :表示在该节点之前曾经走过哪些节点(我从哪里来)

选择列表:表示在该节点之后可以走去哪些节点(我到哪里去)

结束条件:表示走到哪个节点停止

约束条件:表示哪个节点不能经过或没必要经过,也可以理解成剪枝条件


还是以上面的例子来说,假如我们现在站在节点 4,那么路径就是 12,选择列表就是 78

结束条件就是到达叶子节点,该题目隐含的约束条件就是已经走过的节点不能重复走


3、框架


深度优先搜索函数针对每个节点进行处理,输入某个节点的路径和选择列表,该函数完成以下的功能:


判断当前节点的路径是否满足结束条件

如果能够满足结束条件,当前路径即为合法路径,将其保存为答案


判断当前节点的路径是否满足约束条件

如果不能满足约束条件,当前路径即为非法路径,跳过后续的处理


遍历当前节点的选择列表得到所有可能的下一节点

对每个节点递归调用函数并输入该节点对应的路径和选择列表


递归调用该函数后,会搜索问题域中的所有可能解,并将合法答案保存下来

而实现该函数的核心难点在于如何正确维护每个节点对应的路径和选择列表

方法也很简单,只需要在递归前更新路径和选择列表,在递归后还原路径和选择列表即可

具体的代码框架如下:

def dfs(路径,选择列表):
  if  能符合结束条件:
    表示当前路径合法,保存当前路径(已经找到正确路径,看要求来决定是否往下走)
  if  不符合约束条件:
    表示当前路径非法,跳过剩下步骤(当前路径已经错误,没必要往下走)
  for 选择 in 选择列表:
    更新路径和选择列表(即做出选择,具体是将当前选择加入路径,将当前选择从选择列表中删除)
    dfs(路径,选择列表)
    还原路径和选择列表(即撤销选择,具体是将当前选择从路径中删除,将当前选择加入选择列表)


目录
相关文章
|
算法 测试技术 定位技术
数据结构与算法——DFS(深度优先搜索)
数据结构与算法——DFS(深度优先搜索)
|
人工智能 运维 算法
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
263 3
|
监控 算法 安全
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
296 1
|
运维 监控 JavaScript
内网网管软件中基于 Node.js 的深度优先搜索算法剖析
内网网管软件在企业网络中不可或缺,涵盖设备管理、流量监控和安全防护。本文基于Node.js实现深度优先搜索(DFS)算法,解析其在网络拓扑遍历中的应用。通过DFS,可高效获取内网设备连接关系,助力故障排查与网络规划。代码示例展示了图结构的构建及DFS的具体实现,为内网管理提供技术支持。
258 11
|
7月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(Python代码实现)
365 3
|
算法 安全 网络安全
数据结构之网络攻击路径(深度优先搜索)
本文介绍了如何使用深度优先搜索(DFS)算法分析网络攻击路径。在网络安全领域,DFS用于检测网络中潜在的攻击路径,帮助安全人员及时发现并阻止威胁。文中详细描述了网络图的构建、节点间的连接关系以及DFS的实现过程。通过一个具体的例子,展示了如何检测从一个普通节点到关键节点的攻击路径,并讨论了DFS算法的优缺点。提供的C++代码实现了网络图的构建和攻击路径的检测功能。
366 24
|
机器学习/深度学习 算法
算法系列之搜索算法-深度优先搜索DFS
深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜索,直到到达顶点。深度优先搜索会沿着一条路径不断的往下搜索,直到不能够在继续为止,然后在折返,开始搜索下一条候补路径。
974 62
算法系列之搜索算法-深度优先搜索DFS
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
465 0
|
算法 安全 Java
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
在算法学习中,深度优先搜索(DFS)是一种常用的图搜索算法,通过递归或栈实现,适合路径搜索、连通性、拓扑排序、回溯、生成、环路检测、强连通分量和可达性等问题。本文将介绍如何利用深度优先搜索解决“妖怪和尚过河问题”的所有方式。
252 26
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
|
存储 算法 JavaScript
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
203 6

热门文章

最新文章

下一篇
开通oss服务