首页 > 其他分享 >浅析BFS

浅析BFS

时间:2024-03-24 17:58:54浏览次数:34  
标签:queue map 节点 BFS 搜索 浅析 first

广度优先搜索(BFS)

广度优先算法(BFS)又称宽度优先搜索,是指依次将与根节点路径长度(默认每条边长度相同)相同的点遍历,再遍历路径长度加一的点,直到遍历完整个图结束。

BFS在树中的应用

  • 作用:BFS用于在树中搜索某个特定的数据。

  • 方法:从根节点开始搜索,按层遍历整个树。一般使用队列(queue)结构存储层节点。

图1是BFS的效果演示图,每搜索到一个节点,判断是否符合要求,若不符合,则将它的孩子节点推入队列中,然后该节点出队列,直到队列为空时停止搜索,并返回搜索失败。
图1

BFS在图中的应用

  • 作用:搜索图中某个特定的数据,并记录distance
  • 方法:从给定的起始节点开始,将与该点存在边的点放入队列,直到队列为空时结束搜索
  • 不同:与树不同的是,不同的点可能会连接到同一个点,因此在图的BFS算法中,还要使用一个Set记录已经搜索过的点

在这里插入图片描述

性能分析

时间复杂度

在最差的情况下,BFS算法会搜索图中的每一个点,并且将每个点的边都加入队列中,因此时间复杂度最差为:O(|V| + |E|),|V|是顶点的数量,|E|是边的数量

空间复杂度

对邻接表来说,邻接表存储所有的点,以及每个点的所有边,所以空间复杂度也是:O(|V| + |E|),但是这个说法有争议,在Wikipedia上也给出了另一种:O(B^M),其中B是最大分支系数,而M是树的最长路径长度

代码实现

/**
*本实例考虑的对象是树
*@param edges edges是邻接表
*@param val val是要查找的数据
*@return 返回所查找的点的深度
*/
public int bfs(ArrayList<LinkedList<String>> edges, String val) {
    Deque<String> queue = new ArrayDeque<>();
    
    //用一个map存放每个节点的深度
    Map<String, Integer> map = new HashMap<>();
    
    queue.addLast(root);
    map.put(root, 0);
    
    //设置队列的首元素
    String first = root;
    
    while(!queue.isEmpty()) {
        first = queue.getFIrst();
        if(first.equals(val)) {
            return map.get(first);
        }
        
        
        //vertexes是点集,每个点在点集中的索引和它在遍集中的索引相同
        int index = vertexes.indexOf(first);
        int depth = map.get(first);
        
        LinkedList<String> ll = edges.get(index);
        
        ll.forEach(o -> {
            queue.addLast(o);
            map.put(o, depth + 1);
        });
        
        queue.removeFirst();
    }
    
    return -1;
}

标签:queue,map,节点,BFS,搜索,浅析,first
From: https://blog.csdn.net/m0_73435415/article/details/136991730

相关文章

  • 【BFS】(代码详解)
    全面学习BFS的可以参照以下路径,本文章只附上部分代码的解释作为学习记录共勉(星星眼)原文链接:https://blog.csdn.net/m0_62881629/article/details/125072287给定一个n×mn×m的二维整数数组,用来表示一个迷宫,数组中只包含00或11,其中00表示可以走的路,11表示不可通过......
  • 1.基于搜索的路径规划:BFS、DFS、Dijkstra、A*、JPS
    1.概览可以对比不同算法的小动画 PathFinding.js(qiao.github.io)工作空间规划机器人有不同的形状和大小碰撞检测需要了解机器人的几何形状,耗时且难度大 我们希望将机器人表示为点,只需要把工作空间转换为配置空间C-obstacle,将原始的空间膨胀,这是一次性的C-space......
  • C++ 参数传递浅析
    全文目录概述值传递(pass-by-value)什么是变量?值传递的例子指针传递(pass-by-pointer)什么是指针?指针传递的例子引用传递(pass-by-reference)什么是引用?引用和指针的异同引用传递的例子写在最后小结概述众所周知C++参数传递有三种,分别问值传递、指针传递、引用传......
  • C++内置 new /delete 运算符浅析
    全文目录malloc()/free()原型解析简化版本用法举例new/delete静态/动态类型new/delete运算符原型常用但没有注意区分的例子使用new分配对象的生存期那new/delete都做什么事呢几个注意点写在最后malloc()/free()提到new/delete运算符就不得不说malloc()/f......
  • 【力扣】岛屿数量(体会一下dfs和bfs思路的实质)
    题目描述注意,需要求的是岛屿的数量,而不是岛屿的总面积,这道题很考验对dfs思路的理解,而不是简单地套用模版。可以用dfs和bfs两种方法做。深度优先搜索版本首先看代码:classSolution{private:intdir[4][2]={0,1,1,0,-1,0,0,-1};//四个方向voiddfs(ve......
  • 《牛客》-E魔法之森的蘑菇(经典BFS变种)
    思路:由于某些固定方向的情况,我们将到达该点的粒度划分成从那个方向的到达该点,及基础bfs为每个点可以到达一次,变成没个点可以到达四次(四个方向)用一个三维数组进行标记vis[N][N][4],其余细节看下方ACcodeACcode:#include<bits/stdc++.h>usingnamespacestd;#defineendl......
  • 浅析ChatGPT的秘密:它如何颠覆我们对AI的认知?
    ChatGPT迅速成为公众和专业圈子关注的焦点。技术和投资界的权威人物纷纷投入到对这一技术的评估和讨论中。比尔·盖茨在接受《福布斯》杂志采访时,列举了ChatGPT的三个潜在应用:辅助学习、提供医疗建议以及创作诗歌。甚至埃隆·马斯克在推特上也对ChatGPT表示了自己的看法,认为......
  • BFS记忆化搜索---标记
    迷宫(洛谷)题目描述给定一个\(N\timesM\)方格的迷宫,迷宫里有\(T\)处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。输入格式第......
  • 刷题日记——干碎那个BFS!(含国科大机试2021)
    例题小引——迷宫问题问题描述:迷宫由n行m列的单元格组成(n,m都小于等于50),每个单元格要么是空地,要么是障碍物。现请你找到一条从起点到终点的最短路径长度。分析——(迷宫问题BFS解法)使用BFS算法,进行广度优先遍历,总体思路是访问一个结点,就把相邻的结点入队,然后下一个访......
  • bfs判重的坑
    在\(bfs\)中判重时,应优先在入队时进行判重,而不是在出队时进行判重,因为一个节点\(u\)在入队到出队的过程中,可能需要先出队很多其他节点\(v\),这就会导致其他节点出队且加入新节点的过程中,可能会重复加入多次节点\(u\),进而导致\(queue\)占用的空间过大,最后可能有几个点\(MLE......