深度优先与宽度优先搜索(python)

news2025/8/3 4:35:28

算法原理

在这里插入图片描述
1、宽度优先搜索:

宽度优先搜索算法(Breadth First Search,BSF),思想是:

  • 从图中某顶点v出发,首先访问顶点v
  • 在访问了v之后依次从左往右访问v的各个未曾访问过的邻接点;
  • 然后分别从这些邻接点出发依次从左往右访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问(C点优先于B的子节点);
  • 直至图中所有已被访问的顶点的邻接点都被访问到;
  • 如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

      换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路 径长度为1,2…的顶点。

如上图的BFS访问顺序为:A->B->C->D->E->F

2、深度优先搜索:

图的深度优先搜索(Depth First Search, DFS),和树的前序遍历非常类似。

它的思想:

  • 从顶点v出发,首先访问该顶点v;
  • 然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图(B点的子节点孙节点…都优先于C点);
  • 直至图中所有和v有路径相通的顶点都被访问到。
  • 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止

如上图的BFS访问顺序为:A->B->D->E->C->F

# -*- coding: utf-8 -*-
 
from collections import deque    # 线性表的模块
 
# 首先定义一个创建图的类,使用邻接矩阵
class Graph(object):
    def __init__(self, *args, **kwargs):
        self.order = []  # visited order
        self.neighbor = {}
 
    def add_node(self, node):
        key, val = node
        if not isinstance(val, list):
            print('节点输入时应该为一个线性表')    # 避免不正确的输入
        self.neighbor[key] = val
 
    # 宽度优先算法的实现
    def BFS(self, root):
        #首先判断根节点是否为空节点
        if root != None:
            search_queue = deque()
            search_queue.append(root)
            visited = []
        else:
            print('root is None')
            return -1
 
        while search_queue:
            # search_queue =[B,C] 
            person = search_queue.popleft()# B
            # search_queue =[C] 
            self.order.append(person)# [A, B]
 
            if (not person in visited) and (person in self.neighbor.keys()):
                # self.neighbor[person] = [D, E]
                # search_queue [C] 
                search_queue += self.neighbor[person]
                # search_queue [C, D, E] 从左往右宽度优先
                visited.append(person)
 
    # 深度优先算法的实现
    def DFS(self, root):
        # 首先判断根节点是否为空节点
        if root != None:
            search_queue = deque()
            search_queue.append(root)
 
            visited = []
        else:
            print('root is None')
            return -1
 
        while search_queue:
            # search_queue =[B,C] 
            person = search_queue.popleft()
            # search_queue=[C]
            self.order.append(person)
             # order = [A,B]
            if (not person in visited) and (person in self.neighbor.keys()):
                tmp = self.neighbor[person]#[D, E]
                tmp.reverse()# tmp 因为下面打算左添加
                 # search_queue=[C] # 左边添加 tmp
                for index in tmp:
                    search_queue.appendleft(index)
                # search_queue =[D,E,C] 从左下到右,深度优先
 
                visited.append(person)# visited= [A, B]
 
    def clear(self):
        self.order = []
 
    def node_print(self):
        for index in self.order:
            print(index, end='  ')
 
 
if __name__ == '__main__':
    # 创建一个二叉树图
    g = Graph()
    g.add_node(('A', ['B', 'C']))
    g.add_node(('B', ['D', 'E']))
    g.add_node(('C', ['F']))
 
    # 进行宽度优先搜索
    g.BFS('A')
    print('宽度优先搜索:')
    print('  ', end='  ')
    g.node_print()
    g.clear()
 
    # 进行深度优先搜索
    print('\n\n深度优先搜索:')
    print('  ', end='  ')
    g.DFS('A')
    g.node_print()
    print()

运行结果:

在这里插入图片描述

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

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

相关文章

loT行业生死竞速:Aqara绿米得用户得天下

作者 | 曾响铃 文 | 响铃说 日前,社科院发布了一份“2022年秋季中国宏观经济形势分析”报告,报告中指出当前,世界经济增长预期下挫,全球通胀居高不下,而中国经济整体仍呈持续恢复状态,但经济内增长动能仍…

【数据结构】树和二叉树以及经典例题

目录1.树的基本概念1.1 树的特点1.2 树的一些相关概念1.3 树的表示1.3.1 那种结构表示树最优?(不是二叉树,就是普通的树)1.4 树在实际中的运用(表示文件系统的目录树结构)2. 二叉树(重点&#x…

嵌入式linux实现pppoe拨号上网

make menuconfig -> Device Drivers -> Network device support -> PPP (point-to-point protocol) 中,选中所有ppp选项。退出,保存配置,修改Makefile重新执行make zImage. 将arch/mips/boot/下的zImage下载到开发板上重启系统。 t…

oracle数据库的导入与导出

1、oracle数据库导入与导出需要注意 2、导出数据格式介绍 3、 传统方式exp(导出)和(imp)导入 3.1 命令执行方式 3.2 命令格式 3.3 导出数据 3.3.1示例 3.4 导入数据 3.4.1 导入数据 4 使用PL/SQL Developer 实现数据导入与导出 4.1 导出与导…

文本分类微调技巧实战2.0

讯飞比赛答辩结束,笔者和小伙伴们参加了一些讯飞的比赛,今年讯飞文本分类比赛相比去年更加多元化,涉及领域、任务和数据呈现多样性,听完各位大佬的答辩之后,结合之前经验和以下赛题总结下文本分类比赛的实战思路。 1 …

allegro16.6导出版图到ADS2019仿真的方法

首先配置好allegro软件 1. 选择FILE->Script, 弹出窗口后选择Browse , 选择ADS对应文件夹下\Keysight\ADS2019\ial\scripts的描述文件,并勾选Change Directory 点击确认; 2.回到Scripting界面点击Replay ; 在弹出的窗口红框位…

Au NPs/FA/PAMAM-DOX 金纳米粒子/叶酸/聚酰胺-胺型树枝状高分子修饰阿霉素的研究

下面小编要分享给大家的内容是Au NPs/FA/PAMAM-DOX 金纳米粒子/叶酸/聚酰胺-胺型树枝状高分子修饰阿霉素,和小编一起来看! PAMAM-DOX 聚酰胺-胺型树枝状高分子修饰阿霉素制备方法: 采用逆向蒸发结合pH梯度法制备LLDs-PAMAM-DOX,观察形态,测定…

基于SpringBoot的体育场运营系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SpringBoot 前端:采用HTML和Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Mav…

【QT知识】在widget中的绘制事件函数

在widget中的绘制事件函数 文章目录1. 代码实现头文件部分cpp文件部分2. 事件函数参考博客&#x1f60a;点此到文末惊喜↩︎ 1. 代码实现 头文件部分 #include <QWidget> #include <QPainter>namespace Ui { class widget_2_1; }class widget_2_1 : public QWid…

相控阵天线(四):阵列天线波束赋形(遗传算法、粒子群算法、进化差分算法)

目录波束赋形简介遗传算法波束赋形粒子群算法波束赋形差分进化算法波束赋形智能算法比较遗传算法波束赋形代码示例波束赋形简介 根据期望的方向图辐射特性(如方向图形状、主瓣宽度、副瓣电平、方向性系数)并以某种方法求得阵面电流分布并将此电流分布施加于相应通道中&#xf…

CCF CTO Club 16期活动记事——走进腾讯,实现连接

11月17日&#xff0c;有幸通过CCF CTO Club活动报名&#xff0c;参观了腾讯北京的总部&#xff0c;在腾讯总部大楼7层宴会厅尝到了美食&#xff0c;还参加了“云原生技术的探索与实践”专场讲座和讨论&#xff0c;味蕾和思维获得了双丰收。 参观腾讯总部 这次参观腾讯北京总部…

用 VS Code 搞 Qt6:信号、槽,以及QObject

用 VS Code 搞 Qt6&#xff1a;信号、槽&#xff0c;以及QObject Qt 里面的信号&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;虽然看着像事件&#xff0c;但它实际上是用来在两个对象之间进行通信的。既然是通信&#xff0c;就会有发送者和接收者。 1、信…

NodeJs实战-待办列表(3)-前端页面填充待办数据

NodeJs实战-待办列表3-前端页面填充待办数据为啥在前端填充待办数据&#xff1f;如何在前端填充待办数据&#xff1f;需要了解的知识页面修改后端服务封装数据返回server.js 修改效果图初始化页面添加待办事项完成待办事项为啥在前端填充待办数据&#xff1f; 第2节的页面数据…

Django基础学习

目录 1、Django MVT模型 2、Django项目和应用 2.1 项目和子应用的创建 2.2 子应用url路由配置 3、Django的templates配置 4、Django请求的处理 4.1 get请求处理 4.2 post请求处理 5、Django数据库操作 5.1、数据库连接配置 5.2、models.py配置 5.3、django数据库表的…

【node进阶】深度解析Koa框架---路由|静态资源|获取请求参数

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

创建自己的函数库

创建自己的函数库前言一、什么是STM32标准函数库1.定义&#xff1a;2.作用&#xff1a;3.对比&#xff1a;二、构建库函数1.修改寄存器地址封装2.定义访问的结构体指针和引脚3.创建封装函数3.1创建拉低引脚函数3.2创建引脚初始化函数总结前言 回顾一下&#xff0c;前面点亮led…

世界儿童日,周大福真诚关爱儿童成长

守护童心 呵护成长 周大福秉持着“用真诚让幸福永恒”的企业理念&#xff0c;百周年承诺“以人为本”。以爱和关怀凝聚社会力量&#xff0c;提倡社会共融&#xff0c;缔造可持续未来。 梦想家祝福 2021年周大福珠宝集团与美丽中国&#xff0c;携手打造“家源于此”项目。于2…

podman-compose 有前途吗?

文章目录1. 前言2. Docker Compose 和 Podman Compose 的历史3. 未来4. 观点5. 安装5.1 pip3 安装5.2 python 安装5.3 dnf 安装6. 示例1. 前言 虽然 Kubernetes 已经发展成为容器编排的主导者&#xff0c;但人们仍然对管理较小规模的容器&#xff08;通常是单个系统&#xff0…

centos7—安装mysql

文章目录1.1 卸载MariaDB1.2 官网下载包文件1.3 解压安装包1.4 安装相关的Mysql服务1.5 开启Mysql服务1.1 卸载MariaDB 由于centOS7中默认安装了MariaDB,需要先进行卸载 rpm -qa | grep -i mariadb #查找本地mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.aarch64 #这个…

nuxt 如何生成sitemap.xml 动静态站点地图

前言 sitemap.xml的作用是将我们网站的所有页面都被SEO&#xff08;浏览器搜索引擎&#xff09;收录&#xff0c;我们网站的内容更容易被用户搜到&#xff0c;同时增加我们的网站的知名度&#xff0c;排名更靠前。简言之就是用技术做网站推广&#xff0c;所以对于网站推广sitem…