Python 程序检测有向图中的环2024 年 8 月 29 日 | 4 分钟阅读 检测有向图中的环是计算机科学中的一个经典问题。有几种算法可以解决这个问题,但最常见的一种是深度优先搜索 (DFS) 算法。 DFS 算法的基本思想是从一个顶点开始,沿着每条分支尽可能深地探索,然后再回溯。在此过程中,该算法将每个访问过的顶点标记为“已发现”,并在堆栈中跟踪当前路径上的顶点。如果它遇到一个已经被发现并且在堆栈中的顶点,那么图中就存在一个环。 用于使用 DFS 检测环的 Python 程序 输出 True False 说明 第一个图有一个环(A->C->A),而第二个图没有。has_cycle 函数接受一个字典来表示图,其中每个键是一个节点,相应的值是其邻居列表。例如,图{'A': ['B', 'C'], 'B': ['C'], 'C': ['A']} 表示一个有边A->B, A->C 和C->A 的有向图。 该函数初始化两个集合:visited 用于跟踪已访问的顶点,stack 用于跟踪当前路径上的顶点。之后,它定义了一个嵌套的 DFS 函数,该函数接受一个节点并返回“True”(如果检测到环),否则返回“False”。 DFS 函数首先将节点标记为已访问并将其添加到堆栈中。之后,它会递归地对尚未访问的节点的每个邻居调用自身。如果邻居已被访问并且在堆栈中,则存在环,并且函数返回“True”值。 如果未检测到当前节点的环,则将其从堆栈中移除并返回False。has_cycle 函数中的外部循环仅遍历图中的所有节点,并对任何未访问的节点调用DFS 函数。如果检测到环,则函数返回True;否则,返回False。 时间复杂度 DFS 算法访问每个顶点和每条边恰好一次,因此其时间复杂度为O(V + E),其中V 是顶点的数量,E 是图中的边的数量。在最坏的情况下,该算法可能会访问图中的所有边,对于完全连接的图,这会产生O(V^2) 的时间复杂度。 空间复杂度 DFS 算法的空间复杂度取决于图的大小和递归堆栈的最大深度。在最坏的情况下,图是一条直线,堆栈可能包含所有顶点,空间复杂度为O(V)。但是,堆栈的最大深度通常远小于V,因此空间复杂度通常低得多。 在提供的实现中,我们使用了两个集合:visited 和 stack,两者最多可以存储V 个元素。此外,我们还有一个最大深度为V 的递归调用堆栈。因此,该算法的空间复杂度为O(V)。 总之,DFS 算法是检测有向图中环的非常高效的算法。其时间复杂度为O(V + E),空间复杂度为O(V)。 检测有向图中的环有不同的方法。以下是另外两种方法:
在有向无环图 (DAG) 中,我们可以对节点进行拓扑排序,该排序会按顺序排列节点,使得所有边都从前面的节点指向后面的节点。如果图中存在环,则无法对其进行拓扑排序。因此,我们可以修改拓扑排序算法,在构建排序顺序的同时检测环。该方法的时间复杂度为O(V + E),其中V 是顶点的数量,E 是图中的边的数量。
Tarjan 算法是检测有向图中环的另一种流行算法。它基于图的强连通分量 (SCC) 的概念。SCC 是图中的一个节点子集,其中每个节点都可以从子集中的任何其他节点到达。Tarjan 算法在图上执行修改后的 DFS 并识别SCC。如果任何 SCC 包含多个节点,则图中存在环。该方法的时间复杂度为O(V + E),其中V 是顶点的数量,E 是图中的边的数量。 |
Python 的 signal 模块是标准库的一部分,它提供了处理信号的机制,信号是发送到正在运行的程序的中断。信号可用于多种目的,例如进程间通信、错误处理和超时实现。signal 模块...
阅读 17 分钟
在本教程中,我们将学习如何使用 Python 创建一个生日提醒应用程序。我们的 Python 脚本名称是 birthdayReminder.py。以下命令在我们的 Ubuntu 终端中完成了此操作。然后,使用 Ubuntu 终端中的以下命令,我们将文件移动到...
阅读 4 分钟
闹钟总是有用的,可以在我们睡觉时提醒我们,小睡片刻,或者提醒我们可能忘记的一些重要日子。闹钟是一种时钟,用于在设定的时间发出警报...
阅读9分钟
先决条件:Python 中的循环,Python 中的跳转语句 - break continue 语句是第二个跳转语句,它为我们提供循环控制。在本文中,我们将学习 continue 语句的功能和重要性。我们之前讨论过 break 语句。它终止整个循环...
5 分钟阅读
在本教程中,我们将通过跳过 GIL 来学习 Python 中的并行处理。GIL 是 Python 中的一个重要概念,它阻止多个线程在同一进程中并行执行 Python 字节码。这意味着即使在多核处理器上,Python 线程...
14 分钟阅读
在本文中,您将学习如何将给定数字转换为单词。有多种方法可以帮助将给定数字转换为单词。方法 1:一种方法如下:def convert_to_words(num): if num == 0: ...
7 分钟阅读
在本教程中,我们将学习 Python 中用于字符串格式化的模运算符。如果用户正在使用 Python 3 编写现代 Python 代码,他们将需要使用 f-string 等 Python 字符串格式化器来格式化他们的字符串。但是,如果他们在旧的 Python 上工作……
阅读 13 分钟
Python 与 Scala 在本教程中,我们将学习 Python 和 Scala 之间的基本区别。两种语言都有一些相似之处,但在这里我们将看到它们之间的主要区别。让我们从它们的介绍开始。什么是 Python?Python 是一种高级、通用且用户友好的动态编程语言。
阅读 3 分钟
Python 中的语音识别 您是否想过 Google Assistant 或 Amazon Alexa 是如何识别您所说的一切的?您可能会想到一些复杂的智能技术在背后运作。除了在识别系统技术巨大增长的市场中大获成功外,...
阅读 17 分钟
Set:Python 内置的 set 类型具有以下特点:集合是无序的。集合由唯一元素组成。不允许使用重复元素。构成集合的元素必须是不可变类型;集合本身可以更改。Python 中的 Set 是...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India