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

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 = valself.left = Noneself.right = None# 二叉树的DFS遍历
def dfs_binary_tree(root):if root is None:returnprint(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 = valself.left = Noneself.right = None# 二叉树的BFS遍历
def bfs_binary_tree(root):if root is None:returnqueue = 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.hqwc.cn/news/28411.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MonoDTR Monocular 3D Object Detection with Depth-Aware Transformer 论文学习

论文链接:MonoDTR: Monocular 3D Object Detection with Depth-Aware Transformer 1. 解决了什么问题? 单目 3D 目标检测对于自动驾驶很重要,也很有挑战性。 现有的一些方法通过深度预测网络得到深度信息,然后辅助 3D 检测&…

MySQL约束和查询

约束和查询 1. 约束1.1 约束类型1.2 常用的约束 2. 查询2.1 聚合查询2.1.1 聚合函数2.1.2 GROUP BY2.1.3 HAVING 2.2 联合查询2.2.1 内连接2.2.2 外连接 2.3 合并查询 1. 约束 1.1 约束类型 NOT NULL - 指示某列不能存储 NULL 值。UNIQUE - 保证某列的每行必须有唯一的值。DE…

Python自动获取字母站视频

如果有疑问的话可以在我的谈论群:706128290 来找我 目录 前言 二、编写代码 1.引入库 2.编写主类 3. 自动获取cookies值和生成headers 4.获取命令行参数 运行效果 前言 browser_cookie3 第三方模块 browser_cookie3是browser_cookie模块的分支,…

小白到运维工程师的自学之路 第五十四集 (ansible自动化运维工具)

一、概述 Ansible是一种开源的自动化工具,用于自动化任务的执行、配置管理和应用部署。它采用基于Python编写的简单、轻量级的语法,可以通过SSH协议远程管理和配置多台计算机。 Ansible的主要特点包括: 1、简单易用:设计简单&a…

Redis数据结构 — List

目录 链表结构设计 ​编辑链表节点结构设计 链表的优势与缺陷 Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构的,所以 Redis 自己设计了一个链表数据结构。 链表结构设计 typedef struct list {//链表头节点listNode *head;//链表…

顺序结构

基本概念顺序表实现Arraylist类使用:小小练习 基本概念 数据结构:描述和组织数据的方式。 数据结构的两种分类方式逻辑结构和物理结构: 逻辑结构:数据元素之间的相互关系;逻辑结构分以下四种。 1:集合&…

Ubuntu查找并安装指定版本包

命令如下: #查看指定包信息 apt-cache show kubeadm | grep 1.23.2 #安装指定版本 apt-get install kubeadm1.23.2-00

浙大数据结构第四周之04-树5 Root of AVL Tree

题目详情: An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Fi…

安卓进程间通信浅谈

Case: /Users/lucas/AndroidStudioProjects/aidldemo-master 一:操作系统 从操作系统原理去看,进程通信主要有三个方法:共享存储、消息传递、管道通信。 二:安卓中的IPC 进程间通信的几种方式:Intent(Bu…

计网笔记--应用层

目录 1--网络程序的组织方式和关系 2--动态主机配置协议(DHCP) 3--域名系统DNS 4--文件传输协议FTP 5--电子邮件 7--万维网WWW 7-1--HTTP的报文格式 7-2--Cookie 7-3--万维网缓存和代理服务器 1--网络程序的组织方式和关系 网络应用程序在各种…

7.12~7.13学习总结

public static void main(String[] args){File dirnew File("D:\\小花花");boolean flag dir.mkdir();System.out.println(flag);File dirsnew File("D:\\小花花\\你爸爸");dirs.mkdirs();String[]adir.list();//列出下一级;字符串数组for(Stri…

【群智能算法改进】一种改进的猎人猎物优化算法 IHPO算法[1]【Matlab代码#49】

文章目录 【获取资源请见文章第5节:资源获取】1. 原始HPO算法2. 改进后的IHPO算法2.1 Cubic映射初始化2.2 透镜成像折射反向学习2.3 强制切换策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 原始HPO算法 此算法…