广度优先搜索(BFS)

简介: 广度优先搜索(BFS)

广度优先搜索(BFS)

广度优先搜索,顾名思义,就是在搜索的时候,广度优先,优先遍历当前的子节点,进行搜索.比如:

有一个文件夹/test

image.png

里面有着大大小小的文件以及子文件夹,当你需要搜索一个名字为:仙士可.txt的文件时

你需要怎么遍历呢?

首先,我们把/text下的文件及文件夹称作为v0级文件,以此同理,vo级文件夹下的子文件为v1级...v2

1:遍历v0级文件,判断是否有仙士可.txt

2:保存v0级文件夹

3:遍历vo级文件夹的第一个文件夹,获取v1级所有文件,判断

4:保存v1级所有文件夹

5:继续遍历第2步v0级第二个文件夹,获取v1级,判断

6:保存v1级所有文件夹

7:继续遍历第2步v0级第三个文件夹.....

...

8:v0级文件夹遍历完毕,继续遍历第4步获取到的v1级文件夹...

...

在这个过程中,优先遍历上层文件(v0全部遍历完成才会遍历v1)的搜索方法,就叫做广度优先搜索

算法实现

广度优先算法实现具体实现如下:

准备工作:


1:创建一个数组,用于记录已经遍历的文件夹(通用写法,当你的v2级文件夹,有一个是v0级的快捷方式的时候,需要判断一下是否已经遍历过了,如果有就不再遍历)

2:创建一个队列,用于记录需要遍历的文件夹 (队列的特性是先进先出,优先遍历的v0级会全部先出列,然后是v0级的第一个v1,以此类推,)

注意:

记录以及遍历的文件夹是广度优先搜索的通用写法,在这个文件夹遍历的需求中可能看不出作用,这个一般应用于当子级可以链接到上一级的数据的时候才用到,进行判断过滤

算法需求拆分

1:队列,  用于记录需要处理的搜索工作

2:获取子级数据  根据出列的数据,进行获取它的子级数据

3:判断搜索任务  判断这个搜索算法的任务是否完成(例如这里面的是,只要找到了仙士可.txt文件即完成任务,可退出遍历,当然也可以设定任务为遍历全部数据(队列为0时代表遍历完成),用于统计层级数据等需求)

4:判断任务数据  判断当前数据是否已经遍历过,是否跳过

5:子级数据入列  当该子级的文件判断完毕时,需要将子级可以继续遍历的数据入列,等待遍历

php实现如下:

<?php
$queue = \[\];//通过数组,数组函数array\_push(入队列),array\_shift(出队列)  实现伪队列
$ergodic = \[\];//通过php的hash数组特性,直接$ergodic\[hash(文件夹名)\]=1; 进行表示该文件夹名已遍历
$rootPath = '/www/easyswoole/tioncico_demo/test';
//顶级目录入列
array_push($queue, $rootPath);
while ($path = array_shift($queue)) {
    //判断目录是否已经遍历过
    if (checkTask($ergodic, $path)) {
        continue;
    }
    //标记该目录已经遍历过
    $ergodic\[md5($path)\] = 1;
    //获取目录的数据
    $fileData = getDirData($path);
    //判断是文件,还是文件夹
    foreach ($fileData as $file) {
        //过滤本级目录以及上级
        if ($file == '.' || $file == '..') {
            continue;
        }
        $filePath = "{$path}/$file";
        echo "当前遍历文件:{$filePath}\\n";
        if (is_file($filePath)) {//如果是文件,则处理文件
            //判断文件终止情况
            if (checkFile($filePath)) {
                echo "文件搜索成功,路径为:{$filePath}\\n";
                break 2;
            }
        } elseif (is_dir($filePath)) {//如果是目录,则入队列,继续处理
            //入列
            pushQueue($queue, $filePath);
        } else {
            continue;
        }
    }
}
/**
 * 扫描文件夹(获取子级数据)
 * getDirData
 * @param $path
 * @return array
 * @author Tioncico
 * Time: 11:55
 */
function getDirData($path)
{
//扫描文件夹
    $file = scandir($path);
    return $file;
}
//判断遍历条件是否完成
function checkFile($data)
{
    if (basename($data) == '仙士可.txt') {
        return true;
    }
    return false;
}
//判断该任务是否已经遍历过
function checkTask($ergodic, $path)
{
    return isset($ergodic\[md5($path)\]);
}
//子级数据入队列
function pushQueue(&$queue, $data)
{
    array_push($queue, $data);
}

输出:

image.png

如果不需要遍历条件,则会遍历所有目录:

image.png

其他

最短路径-Dijkstra算法  文章中,为了查找效率,使用了 广度优先搜索 ,从起点开始扩散查找,而不是从起点开始一直深入查找

目录
相关文章
|
Web App开发 搜索推荐 安全
免费、好用、强大的开源笔记软件综合评测
笔记产品那么多,为什么要使用开源笔记软件? 开源笔记软件的优点和缺 优点 • 免费使用; • 可扩展性强,满足用户的个性化需求; • 数据更加安全,不用担心开发者突然跑路; 缺点 • 用户最好具备一定的技术,有些功能的使用可能需要用户自 下面是一些比较著名的开源笔记软件。绝大多数开源软件都是针对某款知名笔记软件的替代品,比如印象笔记/EverNote、Roam Research、Notion 等笔记软件的替代品。 具体包括,Joplin、 Turtle、 Laverna、 Boostnote、 Anytype、 Focalboard、 TiddlyWiki 、 Athens、 Trilium.
2845 0
免费、好用、强大的开源笔记软件综合评测
|
存储 分布式计算 API
Open Stack简介
Open Stack简介
617 0
|
8月前
|
Web App开发 计算机视觉 开发者
Ruby自动化:用Watir库获取YouTube视频链接
Ruby自动化:用Watir库获取YouTube视频链接
|
7月前
|
缓存 自然语言处理 算法
大模型意图识别工程化实践
本文重点介绍大模型意图识别能力在智能电视核心链路中的落地过程和思考,对比了基础模型、RAG 、以及7b模型微调三种方案的优缺点。
3413 120
|
JSON 编解码 物联网
理解时间戳的视频理解大模型CogVLM2开源!视频生成、视频摘要等任务有力工具!
随着大型语言模型和多模态对齐技术的发展,视频理解模型在通用开放领域也取得了长足的进步。
|
分布式计算 API Apache
Dask与Apache Spark的对比
【8月更文挑战第10天】随着数据量激增,高效处理成为关键。本文对比了Python领域的两大工具——Dask与Apache Spark。Dask提供类似NumPy和Pandas的API,适用于中小规模数据;而Spark作为内存型处理引擎,擅长超大规模数据处理。我们通过代码实例展示了两者的使用方式,并分析了它们在性能、API及生态系统方面的异同。无论您追求易用性还是高性能,都能从中找到合适的选择。
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】CAFM(Convolution and Attention Fusion Module):卷积和注意力融合模块
**HCANet: 高光谱图像去噪新方法** HCANet是一种结合CNN与Transformer的深度学习模型,专为高光谱图像设计。它使用卷积注意力融合模块(CAFM)捕捉局部和全局特征,并通过多尺度前馈网络(MSFN)增强多尺度信息聚合,提升去噪效果。CAFM包含卷积和注意力分支,整合局部细节与长距离依赖。代码已开源:[GitHub](https://github.com/summitgao/HCANet)。
|
11月前
|
机器学习/深度学习 算法 PyTorch
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-7.0版本进行目标检测的完整流程,包括算法介绍、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。YOLOv5以其高精度、快速度和模型小尺寸在计算机视觉领域受到广泛应用。
4871 0
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
|
Linux 数据安全/隐私保护 虚拟化
centos7部署openVPN
centos7部署openVPN
2935 1
|
SQL 关系型数据库 MySQL
SQLAlchemy使用指南
**SQLAlchemy 指南**:Python SQL 工具包,提供数据库高级抽象。安装:`pip install sqlalchemy`,加上数据库驱动(如 MySQL: `pip install mysql-connector-python`)。基础使用包括:创建数据库连接、定义模型、创建表、添加/查询/更新/删除数据。高级功能涉及关系映射、原生 SQL 语句及 SQLAlchemy Core。推荐阅读官方文档以深入了解。
745 1