Python 中的 DFS (深度优先搜索)17 Mar 2025 | 5 分钟阅读 在本教程中,我们将学习深度优先搜索算法,并用 Python 编程语言实现它。我们将讨论它的基础和简单性。该算法用于解决图相关问题,这对于许多竞争性考试都很有帮助。DFS 是一种遍历算法,用于遍历图或树中的所有元素或搜索元素。让我们对 DFS 进行基本介绍。 深度优先搜索简介DFS 是一种用于遍历图或树数据结构中目标节点的算法。深度优先搜索源自“深度”一词。它优先考虑深度,沿着一条分支进行搜索,直到分支的末端。在 Python 中,我们可以轻松地使用递归和其他数据结构(如字典和集合)来实现它。 图的表示在实现 DFS 算法之前,我们将尝试理解如何在 Python 中表示图。 图有几种版本。图可能在两个节点之间具有有向边(定义源和目标),或者具有无向边。有向图可以带有权重。它完全取决于应用程序来使用其中任何一个图的版本。 为了实现 DFS,我们将使用带有有向边的图,以便遍历整个图。 Python 提供了多种方法来在 Python 中表示图;以下是最常见的方法。
邻接矩阵邻接矩阵是一个 N x N 的方阵(其中 N 是图中节点的数量)。 每一行代表一个节点;每一列代表该节点的潜在子节点。每一对 (行, 列) 代表一个潜在的边。位置 (i, j) 处的非零值表示 i 和 j 之间存在一条边。如果值为零,则表示 i 和 j 之间没有边。 在非加权图中可以使用二元数字(1 表示边存在,0 表示不存在)。 例如,位置 (2, 3) 之间的值 15 表示节点 2 和 3 之间存在一条权重为 15 的边。 我们可以使用二维 Numpy 数组来表示邻接矩阵。 邻接表它是一个由多个列表组成的集合。每个列表代表图中的一个节点,并存储该节点的所有邻居/子节点。 我们可以使用字典来表示邻接列表,其中键是图的节点,值是一个列表,包含这些节点的邻居。 让我们以一个简单的图为例,并用字典表示它。 ![]() 上面的图有四条边。 A -> B A -> C B -> C C -> D 让我们创建一个 Python 字典来表示这个图。 现在我们对如何在 Python 中表示图有了一个想法。让我们实现 DFS 算法。 实现深度优先搜索(非递归方法)让我们考虑以下图用于 DFS 实现。 ![]() 让我们使用 Python 字典将图定义为邻接列表。 我们可以使用递归技术和非递归技术(迭代方法)来实现 DFS。 在本节中,我们将了解迭代方法。 我们将使用栈和列表来跟踪已访问的节点。
DFS 伪代码以下是 DFS 的伪代码。在 init() 函数中,我们对每个节点运行 DFS 函数,因为在大多数情况下,图可能包含两个不同的不连通部分。因此,它确保我们覆盖每个顶点,也可以对每个节点运行 DFS 算法。 注意 - 上面的伪代码是用于递归方法的。让我们使用 Python 代码实现 DFS。 示例 - 输出 A D H C F J G K B E I 图的遍历顺序是“深度优先”的方式。 使用递归方法的 DFS递归是一种流行的解决问题的方法,其中相同的问题被分解为更小的实例。我们将在程序中定义基本情况。让我们理解下面的例子。 示例 - 输出 ['A', 'B', 'E', 'I', 'C', 'G', 'K', 'F', 'J', 'D', 'H'] 遍历顺序再次是深度优先的方式。 复杂度DFS 的时间复杂度表示为 O(V+E),其中 V 表示节点数,E 表示边数。空间复杂度为 0(V)。 算法的应用以下是 DFS 的实际应用。
结论本教程包括 Python 中深度优先搜索的概念,该概念用于遍历图或树。我们讨论了在 Python 中实现 DFS 的递归和非递归方法。我们还定义了如何在 Python 中表示图。 |
在本教程中,我们将学习如何验证列表中是否包含重复元素。这是一个基本的列表程序,可能会在编码面试中被问到。我们将使用各种方法解决这个问题。让我们看看问题陈述。问题陈述 一个整数...
阅读 4 分钟
引言 Python是一种编程语言,提供了几个用于与操作系统交互的内置函数。其中一个函数是Popen,用于在Python脚本中运行外部命令。在本文中,我们将讨论如何使用...
阅读 4 分钟
简介 return 用于从函数返回一个值。用户只能在函数中使用 return 语句。它不能在 Python 函数之外使用。一个 return 语句包括 return 关键字和将在执行后返回的值...
阅读 3 分钟
GitHub, Inc 提供了一个在线托管服务,用于使用 Git 进行应用程序开发和变更控制。它提供了每个软件功能请求、项目访问控制、持续集成、任务管理、错误跟踪以及 Git 的分布式版本控制。它是一家总部位于...的微软公司。
7 分钟阅读
Python 列表推导式与生成器表达式 在本教程中,我们将讨论列表推导式和生成器表达式之间的一些重要区别。两者在语法上非常相似,但它们有一些显著的差异。让我们简要介绍一下列表推导式和生成器表达式。什么是列表推导式?列表...
阅读 4 分钟
用于数据可视化的流行 Python 库称为 Matplotlib。Matplotlib 的数值数学附加组件称为 Numpy。Matplotlib 可以生成出色的图形、图表和数字。Matplotlib 生成面向对象的 API,用于将绘图嵌入到使用 GUI 工具包(如 "Tkinter"、"wxPython" 或...)的应用程序中。
阅读 3 分钟
Boost Python 模块是一个 C++ 库,可以实现 Python 和 C++ 之间的无缝互操作性。它提供了将 C++ 类和函数公开给 Python 的工具,允许它们像用 Python 编写的一样使用。使用 Boost Python,可以定义 C++ 类...
阅读 10 分钟
StringIO模块是一个内存中的、类似文件的对象。它可以用于输入或输出大多数用户期望从普通文件对象获得的功能。一旦用户创建了StringIO对象,它最初是通过提供一个字符串来创建的...
5 分钟阅读
什么是 Matplotlib? Matplotlib 是 Python 中的一个库,用于使用其内置函数创建静态和动态动画和绘图。它具有许多内置功能和内置分析工具,用于分析任何图形或图表。如果我们想绘制任何三维...
阅读 3 分钟
编程很有趣,不是吗?当我们运用创造力时,我们可以从中获得更多乐趣。打印到指定数字的自然数并不那么有趣,但是如果我们能创建一个数字的金字塔呢?听起来很有趣吗?本文包含了逻辑来...
阅读9分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India