Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

news2024/11/28 10:59:52

Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

  • 引言
  • 1. 深度优先搜索( DFS )算法概述
  • 2. 深度优先搜索( DFS )算法实现
    • 实例1:图的 DFS 遍历
    • 实例2:二叉树的 DFS 遍历
  • 3. 广度优先搜索( BFS )算法概述
  • 4. 广度优先搜索( BFS )算法实现
    • 实例1:图的 BFS 遍历
    • 实例2:二叉树的 BFS 遍历
  • 5. DFS 与 BFS 的对比
  • 总结

引言

深度优先搜索( DFS )和广度优先搜索( BFS )是两种常用的图遍历算法,用于在图中搜索目标节点或遍历图的所有节点。本篇博客将介绍 DFSBFS 算法的基本概念,并通过实例代码演示它们的应用。

😃😄 ❤️ ❤️ ❤️

1. 深度优先搜索( DFS )算法概述

深度优先搜索( DFS )是一种用于遍历或搜索图或树的算法,它从起始节点开始,沿着一条路径一直深入直到无法继续为止,然后回溯到上一个节点继续探索。 DFS 使用栈来记录遍历的路径,它优先访问最近添加到栈的节点。

DFS 的主要优点是简单且易于实现,它不需要额外的数据结构来记录节点的访问情况,仅使用栈来存储遍历路径。然而, DFS 可能会陷入无限循环中,因为它不考虑节点是否已经访问过。

2. 深度优先搜索( DFS )算法实现

实例1:图的 DFS 遍历

# 图的DFS遍历
def dfs(graph, start, visited):
    # 访问当前节点
    print(start, end=' ')
    # 标记当前节点为已访问
    visited[start] = True
    # 遍历当前节点的邻居节点
    for neighbor in graph[start]:
        # 如果邻居节点未被访问,则继续深度优先搜索
        if not visited[neighbor]:
            dfs(graph, neighbor, visited)

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

# 标记节点是否已访问的列表
visited = {node: False for node in graph}

# 从节点A开始进行DFS遍历
print("DFS遍历结果:")
dfs(graph, 'A', visited)

代码解释:上述代码演示了使用 DFS 算法遍历图的实例。我们使用邻接表表示图,然后从节点 A 开始进行 DFS 遍历。 DFS 算法通过递归的方式深入遍历每个节点,并使用 visited 字典记录节点是否已经访问过,防止重复访问。

实例2:二叉树的 DFS 遍历

# 二叉树节点定义
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

# 二叉树的DFS遍历
def dfs_binary_tree(root):
    if root is None:
        return
    print(root.val, end=' ')
    dfs_binary_tree(root.left)
    dfs_binary_tree(root.right)

# 构造二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 二叉树的DFS遍历
print("二叉树的DFS遍历结果:")
dfs_binary_tree(root)

代码解释:上述代码演示了使用 DFS 算法遍历二叉树的实例。我们构造了一个二叉树,并使用递归的方式进行 DFS 遍历。 DFS 算法沿着左子树一直深入到底,然后再回溯遍历右子树。

3. 广度优先搜索( BFS )算法概述

广度优先搜索( BFS )是一种用于遍历或搜索图或树的算法,它从起始节点开始,逐层地向外扩展,先访问当前节点的所有邻居节点,然后再访问邻居节点的邻居节点,直到遍历完所有节点。

BFS 使用队列来记录遍历的路径,它优先访问最早添加到队列的节点。 BFS 的主要优点是能够找到起始节点到目标节点的最短路径,因为它是逐层遍历的。

4. 广度优先搜索( BFS )算法实现

实例1:图的 BFS 遍历

from collections import deque

# 图的BFS遍历
def bfs(graph, start):
    # 使用队列来记录遍历路径
    queue = deque([start])
    # 标记节点是否已访问的集合
    visited = set([start])

    while queue:
        node = queue.popleft()
        print(node, end=' ')

        for neighbor in graph[node]:
            if neighbor not in visited:
                queue.append(neighbor)
                visited.add(neighbor)

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

# 从节点A开始进行BFS遍历
print("BFS遍历结果:")
bfs(graph, 'A')

代码解释:上述代码演示了使用 BFS 算法遍历图的实例。我们使用邻接表表示图,然后从节点 A 开始进行 BFS 遍历。 BFS 算法通过使用队列来逐层遍历图的节点,并使用 visited 集合记录节点是否已经访问过,防止重复访问。

实例2:二叉树的 BFS 遍历

from collections import deque

# 二叉树节点定义
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

# 二叉树的BFS遍历
def bfs_binary_tree(root):
    if root is None:
        return

    queue = deque([root])
    while queue:
        node = queue.popleft()
        print(node.val, end=' ')
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)

# 构造二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 二叉树的BFS遍历
print("二叉树的BFS遍历结果:")
bfs_binary_tree(root)

代码解释:上述代码演示了使用 BFS 算法遍历二叉树的实例。我们构造了一个二叉树,并使用队列来逐层遍历二叉树的节点。 BFS 算法先访问根节点,然后依次将左子节点和右子节点添加到队列中,再逐层遍历子树。

5. DFS 与 BFS 的对比

DFSBFS 是两种不同的图遍历算法,在不同的应用场景下具有不同的优势:

  • DFS 适用于找到起始节点到目标节点的路径,但不一定是最短路径。它通过递归的方式深入探索图的分支,因此对于深度较小的图或树, DFS 通常表现较好。

  • BFS 适用于找到起始节点到目标节点的最短路径。它通过逐层遍历图的节点,从而保证找到的路径是最短的。在需要寻找最短路径的情况下, BFS 是更好的选择。

总结

本篇博客介绍了深度优先搜索( DFS )和广度优先搜索( BFS )算法的基本概念,并通过实例代码演示了它们在图和二叉树遍历中的应用。

DFS 是一种深入探索图或树的算法,通过递归方式遍历每个节点,优先访问最近添加到栈的节点。 BFS 是一种逐层遍历图或树的算法,通过队列来存储遍历路径,优先访问最早添加到队列的节点。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。

在这里插入图片描述

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

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

相关文章

理性对道德的作用是很小的

从某种程度上说,理性对道德的作用是很重要的。理性能够帮助我们思考和评估道德问题,并提供合理的解决方案。它使我们能够运用逻辑和推理能力来分析情况,权衡利益和后果,并做出更明智的决策。 理性有助于我们超越个人感受或冲动&am…

如何在医疗器械行业运用IPD?

医疗器械是指单独或者组合使用于人体的仪器、设备、器具、材料或其他物品,包括所需要的软件。按安全性可分为低风险器械、中风险器械和高风险器械。其中低风险器械大都属于低值耗材,其中包括绷带、纱布、海绵、消毒液等;中度风险器械类包括体…

结构型模式 - 适配器模式

概述 如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供…

linux之Ubuntu系列(五)用户管理 终端命令 su 切换用户

# 切换用户 zenxx:su - sup # 录入sup 密码 supxx:$ 切换root用户

增强匿名性:了解 HTTP 代理的作用

当你在浏览网页时,你的个人信息和上网痕迹都是暴露在公共网络之中的,任何人都可以轻松地获取到这些信息。而这种信息泄露不仅会威胁你的个人隐私,还会对你的网络安全带来潜在的风险。为了解决这个问题,HTTP代理应运而生。 而 IPR…

v-model指令获取常见表单项的内容 input,textarea,radio,checkbox,select

v-model指令获取常见表单项的内容 1. v-model 作用和语法2. v-model 获取常见表单项 1. v-model 作用和语法 作用: 给 表单元素 使用, 双向数据绑定 → 可以快速 获取 或 设置 表单元素内容 ① 数据变化 → 视图自动更新 ② 视图变化 → 数据自动更新语法: v-model ‘变量’ …

Day13 01-Linux介绍与安装教程

文章目录 第一章 Linux简介【了解】1.1 Linux的介绍1.2 Linux的两大阵营1.3 CentOS社区版介绍 第二章 Linux的安装【重要】2.1 VMWare&Parallels Desktop的安装2.1.1 VMWare的简介2.1.2 VMWare安装的注意事项2.1.3 Parallels Desktop的简介 2.2 VMWare安装Linux2.2.1 准备事…

UG\NX二次开发 获取工作部件的所有表达式,以及值

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取工作部件的所有表达式,以及值。 效果: 代码: #include "me.hpp" #include <iostream> #include <sstream> #include <string> //double转string保留所有小…

Vue找到package.json中没有用到依赖并删除

引言 一切都是由于强迫症&#xff0c;我想把一个Vue项目中没有用到的依赖删除掉。 解决方法 depcheck Depcheck is a tool for analyzing the dependencies in a project to see: how each dependency is used, which dependencies are useless, and which dependencies are…

高德地图实现水流效果

一、源代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>水系图</title><style>…

Pycharm环境配置

Pycharm是一款功能强大的Python开发工具&#xff0c;它可以帮助用户快速搭建Python开发环境。 1. Pycharm 官网下载安装 https://www.jetbrains.com.cn/en-us/pycharm/ 2. 配制项目Pycharm 环境 Pycharm 可以直接创建项目&#xff0c;&#xff08;如果是github下载的文件&a…

数据结构-树的基本概念和堆

树的基本概念和堆 树的基本概念堆的建立堆的信息堆的初始化堆的push&#xff08;数据插入后&#xff0c;仍要遵守堆的规则&#xff09;堆的pop根的元素值堆的大小堆的销毁演示一个过程&#xff0c;打印出该堆的前k个元素全部代码Heap.hHeap.cTest.c 堆的应用&#xff08;排序&a…

Python 下载安装总结

title: Python 下载安装总结 date: 2023-06-26 16:40:45 tags: Python categories:开发工具及环境 cover: https://cover.png feature: false 1. 下载 进入官网&#xff1a;Python.org&#xff0c;鼠标悬停在 Downloads&#xff0c;就会出现下载按钮 点击下载&#xff0c;即可…

番外-sql server数据库表及视图未备份,误删恢复

&#xff08;1&#xff09;关闭sql server服务&#xff0c;防止数据发生更大变化&#xff1b;备份数据库的ldf文件和mdf文件&#xff08;非常重要&#xff09; &#xff08;2&#xff09;安装工具ApexSQLLog &#xff08;3&#xff09;运行工具 首先设置一下数据库连接的方式…

【产品经理】APP上线准备内容及注意事项

在经历过漫长的开发过程后&#xff0c;APP终于上线了。此时不可掉以轻心&#xff0c;还有很多需要注意的事项&#xff0c;稍不留意有可能会功亏一篑。 一、APP功能注意事项 iOS审核指南&#xff1a;https://developer.APPle.com/cn/APP-store/review/guidelines/ Android每个…

生信学院|07月19日《SOLIDWORKS方程式及全局变量的应用》

课程主题&#xff1a;SOLIDWORKS方程式及全局变量的应用 课程时间&#xff1a;2023年07月19日 14:00-14:30 主讲人&#xff1a;段厉蛟 生信科技 售后服务工程师 课程大纲&#xff1a; 1、SOLIDWORKS方程式及全局变量介绍 2、实例讲解 请安装腾讯会议客户端或APP&#xff…

WebGPU开发简明教程【2023】

WebGPU 是一种全新的现代 API&#xff0c;用于在 Web 应用程序中访问 GPU 的功能。 在 WebGPU 之前&#xff0c;有 WebGL&#xff0c;它提供了 WebGPU 功能的子集。 它启用了新一类丰富的网络内容&#xff0c;开发人员用它构建了令人惊叹的东西。 然而&#xff0c;它基于 2007…

HDFS Hadoop分布式文件存储系统整体概述

HDFS 整体概述举例&#xff1a; 包括机架 rack1、rack2 包括5个Datanode,一个Namenode(主角色)带领5个Datanode(从角色)&#xff0c;每一个rack中包含不同的block模块文件为分块存储模式。块与块之间通过replication进行副本备份&#xff0c;进行冗余存储&#xff0c;Namenode…

[Latex]newcommand\renewcommand\newtheorem的使用、总结、报错

在Latex中经常使用一些自定义的名称&#xff0c;比如 \newtheorem{corollary}[theorem]{Corollary} %推论. 常用的定义类型的命令有&#xff1a; 命令含义举例备注\newcommand只用于定义新命令不能与现有命令重名\renrecommand只用于改变已有的命令的定义重定义已有命令或者定…

Appium+Python+PO 设计模式

目录 前言&#xff1a; 什么是 PageObject? 关于报告的输出 总结 前言&#xff1a; Appium是一个用于自动化移动应用程序测试的开源工具&#xff0c;Python是一种简单易学且功能强大的编程语言&#xff0c;PO&#xff08;Page Object&#xff09;设计模式是一种在自动化测…