Python图算法2025年1月5日 | 15 分钟阅读 图,那些由节点和线组成的纠结的东西,在数学中非常有用。它们有助于解决计算机网络或研究化学形状等棘手问题。它们也是解决城市交通、寻找最佳路线甚至破译人类语言怪癖的秘诀。现在,真正的难题是我们如何使用这些线来访问每个节点,在这些图中移动。有两种众所周知的技巧可以解决这个挑战,我们将在下面揭示它们。 好的,我理解您对具有“困惑度”和“突发度”的文本的要求。在讨论深度优先搜索 (DFS) 和广度优先搜索 (BFS) 图搜索算法时,我将保持这些特征。让我们深入了解这些算法的细节及其底层机制。 深度优先搜索 (DFS) 和广度优先搜索 (BFS) 是基本的图搜索算法,在理解和导航图结构方面发挥着至关重要的作用。 DFS 是我们讨论的第一个算法,它通过一个接一个地遍历图的顶点,沿着其连接的顶点移动,如附带的 GIF 精美地所示。这就像在茂密的森林中循着一条小径,只要分支存在就深入其中。当 DFS 遇到死胡同(例如 GIF 中的顶点 #4)时,它会回溯以检查从起点(顶点 #1)发出的任何其他未探索的分支。DFS 擅长探索类似于线性路径的图结构,没有众多分支选项。 另一方面,BFS 是我们正在探索的第二个算法,它更适用于类似于密集互连网络的图结构,类似于具有众多分支的树。BFS 采用一种策略,在继续前进之前全面检查所有连接的顶点。BFS 不像 DFS 那样沿着单个分支(1 -> 2 -> 3 -> 4)前进,而是并行地查看连接到顶点 #1 的所有相邻顶点,启动类似于您深呼吸时产生的涟漪(因此得名)。 那么,是什么让这些算法起作用呢?魔力在于它们的机制和逻辑。DFS 依赖递归,在回溯之前尽可能深入,而 BFS 则采用队列数据结构同时探索所有相邻顶点。理解各种物理原理对于开发这些算法至关重要。 在这篇文章中,我们将更深入地探讨 DFS 和 BFS 的内部运作,解释它们的原理,并提供代码示例,以确保您完全理解这些概念。在我们探索完这些数学概念之后,您必须对它们的工作原理以及如何在实际情况中使用它们有一个很好的了解。所以让我们从 DFS 开始,深入探讨图搜索算法的领域。 深度优先遍历在进行深度优先搜索 (DFS) 时,我们使用地址列表来记录我们的位置,并使用堆栈来方便我们在探索完一个分支后想要返回时回溯。假设我们正在检查图上的一条路线,从 1 移动到 2,然后到 4,然后到 9,最后到 7。稍后,当我们到达顶点 7 时,我们可能会问我们是否已经探索了所有数据,或者我们是否只是到达了当前分支的末端。我们如何解决这个问题?话虽如此,我们可以信任我们正在使用的堆栈。我们的想法是确保我们尽可能长时间地留在它上面,转移到新的位置。但是,当我们无法从当前位置移动到任何新顶点时,我们开始一个接一个地从堆栈中取出顶点。所以,我们首先移除 7。现在,我们在 9,同样,没有其他地方可去,所以我们取出 9。4 也发生同样的情况。但是当我们在顶点 2 时,我们注意到我们仍然可以移动到顶点 8。所以,我们探索 8,再次,我们到达一个无法再前进的点。我们重复这个过程,回到 2,然后到 1。 当我们的堆栈用尽时,我们认为整个图的遍历已完成。在探索图的不同部分时,堆栈可以保持进度,它还可以让我们跟踪我们去过的地方。 在使用图时,有时我们必须沿着特定路径才能找到所需数据。这类似于在迷宫般的路径中工作。实现这一点的一种方法是使用深度优先搜索,简称 DFS。 DFS 的功能类似于侦探寻找线索。它不是立即检查整个区域,而是深入可视化中的某个部分,并沿着该路线前进,直到达到其极限。之后,它会转身尝试不同的路线。 DFS 采用一种称为“堆栈”的设备,其操作类似于数字便签纸,以跟踪已经去过的地方和仍然需要去的地方。 DFS 在开始时会查看线形图中的一个区域。如果它遇到死胡同,就像迷宫中未完成的街道一样,它会返回到上次有选择的先前位置。通过这种方式,它不会忽略任何潜在的路线。 在 Python 中,我们可以通过使用称为“集合”的数据类型来实现 DFS 来探索图。集合使我们能够维护我们之前探索过的图区域以及我们继续返回的区域的历史记录。这类似于在我们访问过的位置旁边做一个小标记。 简而言之,DFS 是一种聪明的方法,可以导航相互连接的点或数据的迷宫。它就像一个侦探,跟踪线索,必要时回溯,并使用笔记记住他们去过的地方。在 Python 中,我们使用集合来保持侦探的踪迹清晰和有条理。 代码 输出 a c d e 代码解释 这段代码是关于创建一个 Python 类来处理图并执行称为深度优先搜索 (DFS) 的操作。让我们剖析它并理解每个阶段正在发生的事情。
广度优先搜索一种称为广度优先搜索(简称 BFS)的技术对您来说并不陌生。这种结构探索方法类似于逐层遍历图并以这种方式了解它。我们利用一个队列——基本上是一群等待轮到他们的人——来跟踪我们的去向。这有助于我们记住下一步需要访问哪个顶点。 研究和理解结构中连接不同节点的关系的一种方法是使用广度优先搜索技术,简称 BFS。用通俗的话说,让我解释它是如何运作的。假设在一张纸上,有许多相互连接的点,例如定居点。在 BFS 中,您从一个城市开始,我们称之为城市 #1。BFS 不会立即跳到相邻的城市,例如城市 #2,而是采用更彻底的方法。此外,它还前往与城市 #1 关联的城市 #3。因此,我们将城市 #1、城市 #2 和城市 #3 添加到我们将称为“队列”的城市集合中。 目前,我们查看城市 #1,看它是否与任何其他区域有连接。如果它已经到达了它能够访问的每个相邻城市,我们就将其从队列中取出。在城市 #1 从队伍中移除后,我们继续前往城市 #2。作为回应,城市 #2 扫描该区域以寻找附近的城市并将它们添加到队列中。由于它与城市 #2 的连接,因此它可能包括城市 #4、#7 和 #8。 当我们去过每个城市并且您的等待为空时,我们继续执行相同的过程。 要记住的关键区别是,BFS 在移动到下一个点之前会彻底探索一个点的所有连接。相比之下,另一种称为深度优先搜索 (DFS) 的方法一旦访问新点就会继续前进,而不会首先完全探索所有连接。 想象一下您在一个迷宫中,偶尔会遇到死胡同。这就是我们在狩猎过程中发生的事情。当没有更多路径可循时,我们利用队列将我们引导到我们随后的搜索区域。一旦没有更多位置可检查,我们的任务就结束了。 您可以查看我们网页上的详细信息,以了解有关 BFS 如何使用图的更多信息。为了完成这项工作,我们使用了一个名为队列的数据结构与 Python 结合使用。我们不断移动到尚未访问的相邻位置并将它们添加到我们的队列中。然后,我们取出队列中的第一个位置并访问它。我们重复此过程,直到没有更多未访问的位置。 换句话说,BFS 可以被认为是一种系统的方法,用于仔细检查图,确保不会遗漏任何潜在的路径。 代码 输出 a c d e 代码解释 这段代码介绍了一种处理图的简单方法,以及一种称为广度优先搜索 (BFS) 的方法来探索这些图。让我们以更易懂的方式逐步讲解这段代码
Python 图算法的优点Python 是一种流行且灵活的计算机语言,人们使用它来处理图算法。它在处理与图相关的数据结构和算法时提供了许多好处。以下是 Python 在图算法方面表现出色的原因
简而言之,Python 易于理解的语言、灵活性、广泛的图相关工具和强大的社区支持使其成为在许多不同领域处理和试验图算法的绝佳选择。 Python 图算法的缺点Python 是一种广泛用于图算法的编程语言。它因其简单性和可用 NetworkX 和 igraph 等有用库而受到青睐。然而,使用 Python 处理图算法仍然存在一些缺点 性能:由于 Python 是一种解释性语言,它可能不如 Java 或 C++ 等语言快。在处理涉及大型图的密集计算的图算法时,这种性能差异会变得更加明显。
尽管存在这些缺点,Python 仍然是原型设计和处理中小型图算法的首选,尤其是在性能不是首要任务时。对于需要高性能和高效率的应用程序,开发人员通常会寻找其他语言或考虑将 Python 与低级语言集成以满足这些需求。 结论Python 是一种流行的编程语言,以其多功能性和简洁性而闻名。它广泛用于解决涉及图(具有相互连接的点或节点的结构)的复杂问题。图算法在网络分析和推荐系统等领域至关重要。 当我们深入 Python 中的图算法世界时,我们会发现大量的工具和资源。其中一个突出的是 NetworkX 库。它就像一个强大的工具箱,用于创建、研究和可视化复杂的网络和图。其直观的布局和全面的文档使其易于理解,即使对于那些没有经验的程序员也是如此。稍有更多经验,它仍然是一个有用的工具。 Python 工具包中的另一个宝藏是 SciPy 库。它提供了先进的方法来有效解决复杂的图问题。科学家和工程师尤其受益于 SciPy,因为它帮助他们解决了各自领域中的复杂问题。 Python 的超能力之一是其丰富的社区。许多开发人员和用户积极为该语言做出贡献。这意味着您总能找到与图算法相关的帮助、教程和开源项目。这是一个推动创新和创建尖端解决方案的社区。 Python 的吸引力不仅限于其库。它是一种易于阅读和使用的语言,这在处理图算法时是一个很大的优势。其语法允许简洁的代码,使其清晰易懂。 总之,Python 因其出色的库支持、SciPy 和 NetworkX 等出色工具以及活跃的社区而成为图算法的绝佳选择。无论您是研究人员、设计人员还是数据分析师,Python 都能为您提供快速有效地解决复杂网络问题所需的工具。它是各个领域不可或缺的资产。 下一主题Python 中的轮询调度算法 |
我们请求您订阅我们的新闻通讯以获取最新更新。