python 实现depth first search深度优先搜索算法

news2024/10/9 10:19:08

depth first search深度优先搜索算法介绍

深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法。这个算法沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这个过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则另选一个未探索的节点作为源节点,重复以上过程,直到所有节点都被探索为止。

DFS 的基本思想

访问顶点:选择一个顶点作为起始点,标记为已访问。
探索邻接点:从当前顶点出发,探索其所有未被访问的邻接点。对于每个邻接点,递归地执行DFS。
回溯:若当前顶点的所有邻接点都已被访问,则回溯到该顶点的前一个顶点。

DFS 的实现方式

DFS 可以通过递归或栈(显式或隐式)来实现。

递归实现

递归实现是最直观和简单的方式。对于每个顶点,我们检查其所有未被访问的邻接点,并对每个邻接点递归地执行DFS。

def dfs(graph, node, visited=None):
    if visited is None:
        visited = set()
    if node not in visited:
        print(node)
        visited.add(node)
        for neighbour in graph[node]:
            dfs(graph, neighbour, visited)

# 示例图(邻接表表示)
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

# 从顶点 'A' 开始DFS
dfs(graph, 'A')

栈实现

栈实现DFS需要手动管理一个栈来模拟递归的调用栈。

def dfs_iterative(graph, start):
    visited = set()
    stack = [start]

    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            print(vertex)
            visited.add(vertex)
            # 注意,这里是将邻接点加入栈,实现的是后序遍历的效果
            # 如果需要前序遍历,则将邻接点push的顺序调整即可
            stack.extend(reversed(graph[vertex]))

# 从顶点 'A' 开始DFS
dfs_iterative(graph, 'A')

DFS 的应用

DFS 在许多领域都有应用,包括:

图的遍历:找到图中所有的节点。
拓扑排序:在有向无环图(DAG)中,对顶点进行线性排序。
解决迷宫问题:找到从起点到终点的路径。
连接组件:查找图中所有的连接组件。
强连通组件:在有向图中查找所有的强连通组件。
回溯算法:在解决某些类型的优化问题时,DFS 可用于生成所有可能的候选解。

depth first search深度优先搜索算法python实现样例

下面是一个python实现的深度优先搜索算法的示例代码:

# 创建一个图的类
class Graph:
    def __init__(self):
        self.graph = {}

    # 添加边
    def add_edge(self, node, edges):
        self.graph[node] = edges

    # 深度优先搜索算法
    def dfs(self, start_node):
        visited = set()

        def dfs_helper(node):
            visited.add(node)
            print(node, end=' ')

            for neighbor in self.graph[node]:
                if neighbor not in visited:
                    dfs_helper(neighbor)

        dfs_helper(start_node)

# 测试代码
if __name__ == '__main__':
    g = Graph()
    g.add_edge(0, [1, 2, 3])
    g.add_edge(1, [0, 4, 5])
    g.add_edge(2, [0, 6])
    g.add_edge(3, [0, 7])
    g.add_edge(4, [1])
    g.add_edge(5, [1])
    g.add_edge(6, [2])
    g.add_edge(7, [3])

    g.dfs(0)

输出结果为:0 1 4 5 2 6 3 7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

麒麟V10系统下的调试工具(网络和串口调试助手)

麒麟V10系统下的调试工具(网络和串口调试助手) 1.安装网络调试助手mnetassist arm64-main ①在linux下新建一个文件夹 mkdir /home/${USER}/NetAssist②将mnetassist arm64-main.zip拷贝到上面文件夹中,并解压给权限 cd /home/${USER}/Ne…

(23)DBPSK信号在Rayleigh衰落信道条件下的传输性能仿真

文章目录 前言一、MATLAB仿真代码二、仿真结果画图 前言 此示例创建了一个【频率平坦的瑞利衰落信道】对象,并使用该对象来对DBPSK信号进行衰落处理,衰落之后增加了不同信噪比的AWGN,计算出不同的信噪比值计算误码率,并和理论误码…

八、索引的创建与设计原则

文章目录 1. 索引的声明与使用1.1 索引的分类1.2 创建索引1.2.1 在创建表时创建索引1.2.2 在已经存在的表上创建索引1.3 删除索引2. MySQL8.0索引新特性2.1 支持降序索引2.2 隐藏索引3. 索引的设计原则3.1 数据准备3.2 哪些情况适合创建索引3.2.1 字段的数值有唯一性的限制3.2.…

Cisco Catalyst 9000 交换产品系列 IOS XE 17.15.1 发布下载,新增功能概览

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED 思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-catalyst-9000/,查看最新版。原创作品,转载请保留出处。 作者主页&…

Google:敏感信息访问权限和 API 政策更新

目录 公布时间公布内容内容有关 Google Play 照片和视频权限政策的详细信息截止时间相关问题公布时间 公布日期:2023-10-25 公布内容 内容 为向用户提供更注重隐私保护的体验,我们将推出“照片和视频访问权限”政策,以减少获准针对照片/视频请求广泛权限(READ_MEDIA_IM…

探索 ACM:计算机领域的卓越组织

《探索 ACM:计算机领域的卓越组织》 在计算机科学的广袤星空中,ACM(Association for Computing Machinery,美国计算机协会)犹如一颗璀璨的巨星,散发着耀眼的光芒。 ACM 是世界上最大的计算机领域专业性学…

从给定的序列中随机抽取一个元素secrets.choice()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 从给定的序列中随机抽取一个元素 secrets.choice() [太阳]选择题 根据给定的Python代码,哪个选项是不可能输出的? import secrets sequence ["red", &qu…

PCL 法线空间下采样滤波

目录 一、概述二、代码三、结果 一、概述 对于原始点云,通过其点云法向量进行下采样,在法向量变化大的地方采样密度大,在法向量变化小的地方,采样密度小。 计算点云的空间法向量。依次计算相邻点之间的法向量夹角,以此…

Node.js管理工具NVM

nvm(Node Version Manager)是一个用于管理多个 Node.js 版本的工具。以下是 nvm 的使用方法和一些常见命令: 一、安装 nvm 下载 nvm: 地址:https://github.com/coreybutler/nvm-windows/releases访问 nvm 的 GitHub 仓…

Autodesk Flame 2025:视觉特效制作解决方案

Autodesk Flame 2025是一款功能强大的视觉特效制作解决方案,由Autodesk公司开发。它提供了出色的性能,为视觉特效艺术家成功完成制作项目提供了所需的交互性和灵活性。 以下是Autodesk Flame 2025的一些主要特点和功能: 高效的三维合成环境&…

C语言 | Leetcode C语言题解之第464题我能赢吗

题目: 题解: typedef struct HashItem {int key;bool val;UT_hash_handle hh; } HashItem;bool dfs(int maxChoosableInteger, int usedNumbers, int desiredTotal, int currentTotal, HashItem **memo) {HashItem *pEntry NULL;HASH_FIND_INT(*memo, …

C# 图像平移

图像平移:图像的平移是将一幅图像上的所有点都按照给定的偏移量在水平方向沿x轴、在垂直方向上沿y轴移动,平移后的图像与原图像大小相同。设(x0,y0) 为原图像上的一点,图像水平平移量为△x,垂直平移量为△y,则平移后点…

什么是词嵌入(Word Embedding)

1. 什么是词嵌入(Word Embedding) ⾃然语⾔是⼀套⽤来表达含义的复杂系统。在这套系统中,词是表义的基本单元。顾名思义,词向量是⽤来表⽰词的向量,也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌⼊(word e…

【优选算法】(第二十七篇)

目录 重排链表(medium) 题目解析 讲解算法原理 编写代码 合并K个升序链表(hard) 题目解析 讲解算法原理 编写代码 重排链表(medium) 题目解析 1.题目链接:. - 力扣(LeetCod…

数据结构与算法——Java实现 31.阻塞队列

—— 24.10.8 一、问题提出 目前队列存在的问题 1.很多场景要求分离生产者、消费者两个角色、它们需要由不同的线程来担当,而之前的实现根本没有考虑线程安全问题 2.poll方法,队列为空,那么在之前的实现里会返回null,如果就是硬…

Spring Boot 进阶-深入SpringBoot的数据校验原理

在之前的分析中我们知道要想了解一个场景启动器的原理就必须要找到它对应的自动配置类。下面我们就来探索一下数据校验spring-boot-starter-validation场景启动器的原理吧? ValidationAutoConfiguration 配置类 首先我们来看在这个配置类上都有哪些条件注解,并且这些条件注解…

鸿蒙开发实战项目【硅谷租房】--- 项目介绍

目录 一、简述 二、项目资料 2.1 UI设计稿 2.2 服务器 2.3 Apifox接口JSON文件 使用 Apifox 测试接口 一、简述 这是一个基于 鸿蒙 API12 开发的移动端租房 App,用户可以使用该应用搜索租房列表、查看房屋详情、预约租房等。 该项目的tabbar包含五部分&…

OpenTelemetry 演示与 OpenTelemetry 的 Elastic 分发

作者:来自 Elastic Roger Coll 了解 Elastic 如何致力于支持用户使用 OpenTelemetry。探索我们对 OpenTelemetry Demo 的公开部署,并了解 Elastic 的解决方案如何增强你的可观察性体验。 最近,Elastic 为各种 OpenTelemetry 组件引入了 Elas…

谨防网络诈骗,天上不会掉馅儿饼

“网络诈骗现已是国际性问题。” 面对网络诈骗,风险管理工具要选且必须选。网络诈骗日益猖獗,当前背景下,IP风险画像也开始成为了防范网络诈骗的重要工具之一。 近期,一起利用AI换脸拟声技术实施的诈骗案件引起了广泛关注。 一名…

C# 获取可执行文件目录

---------------------------------------------------------------------------