1 概述

算法是作用于具体的数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于图这种数据结构的。主要原因是因为图的这种数据结构表达能力很强,大部分涉及搜索的场景都可以抽象成图。
图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,比如今天要讲的两种最简单、最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。

2 广度优先搜索(Breath First Search)

广度优先搜索(Breath First Search)简称BFS,它是一种地毯式层层推进的搜索策略,即优先查找距离顶底近的,然后是次近的,依次往外搜索。如下图所示BFS搜索策略,搜索结果 1->2-3->4->5->6->7。

算法描述:
1.从图中顶点V出发,首先访问V
2.依次访问V的,各个未被访问的邻接节点
3.依次从上述邻接节点出发,依次访问他们的各个未被访问的邻接节点。
4.如果此时图中任然有未被访问的顶点,则选择图中的一个未被访问的顶点作为起始顶点。重复广度优先搜索的过程,直到图中的所有节点均被访问过。

伪代码描述:

Vertex BFS(G,root){//初始化队列Q=Queue();    //root 顶点入队列Enqueue(root,Q);// label root as exploredvisited[root]=true;while(!Q.isEmpty()) {v=Dequeue(Q);if v is the goal thenreturn v;for all edges from v to w in G.adjacentEdges(v) doif !visited[w] thenvisited[w]=true;Q.enqueue(w);}return null;}

3 深度优先搜索(Depth First Search)

深度优先搜索(Depth First Search)简称DFS,其过程简要来说就是对每一个可能的分支路径深入到不能深入为止,而且每个节点只能访问一次。 图2-1所示DFS搜索策略,搜索结果 1->2->5->7->3->6->4。

算法描述:
1.从图中某个顶点V出发,访问顶点V
2.依次从V未被访问的邻接点出发,对图进行深度优先遍历;直至图中和V有路径相通的顶点都被访问
3.若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

伪代码描述

DFS(G, v) //label v as discoveredvisited[v]=true;for all directed edges from v to w that are in G.adjacentEdges(v) doif  !visited[w] thenrecursively call DFS(G, w)

java 代码实现

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;/*** @author hsc* @date 2022/8/14 11:04 上午*/
public class Graph {//顶点的个数private int v;//邻接表private LinkedList<Integer> adj[];public Graph(int v) {this.v = v;adj = new LinkedList[v];for (int i = 0; i < v; i++) {adj[i] = new LinkedList<>();}}void addEdge(int v, int w) {adj[v].add(w);}void bfs(int s, boolean[] visited) {Queue<Integer> queue = new LinkedList<>();visited[s] = true;queue.add(s);while (!queue.isEmpty()) {Integer vertex = queue.poll();System.out.println(vertex);Iterator<Integer> i = adj[vertex].listIterator();while (i.hasNext()) {int n = i.next();if (!visited[n]) {visited[n] = true;queue.add(n);}}}}void bfs() {boolean[] visited = new boolean[v];for (int i = 0; i < v; i++) {if (!visited[i]) {bfs(i, visited);}}}void dfsUseRecurse(int s, boolean[] visited) {visited[s] = true;Iterator<Integer> i = adj[s].listIterator();System.out.println(s);while (i.hasNext()) {int n = i.next();if (!visited[n]) {dfsUseRecurse(n, visited);}}}void dfsUseStack(int s, boolean[] visited) {Stack<Integer> stack = new Stack<>();visited[s] = true;stack.add(s);while (!stack.isEmpty()) {Integer vertex = stack.pop();System.out.println(vertex);Iterator<Integer> i = adj[vertex].listIterator();while (i.hasNext()) {int n = i.next();if (!visited[n]) {visited[n] = true;stack.add(n);break;}}}}void dfs() {boolean[] visited = new boolean[v];for (int i = 0; i < v; i++) {if (!visited[i]) {dfsUseStack(i, visited);}}}public static void main(String[] args) {Graph graph = new Graph(7);graph.addEdge(0, 1);graph.addEdge(0, 2);graph.addEdge(0, 3);graph.addEdge(1, 4);graph.addEdge(4, 6);graph.addEdge(2, 5);graph.addEdge(5, 6);//从顶点0开始遍历graph.dfs();System.out.println("-----------------");graph.bfs();}
}

4 LeetCode实战

https://leetcode.cn/problems/number-of-islands/description/
思路:dfs 深度优先遍历,将已经访问节点置位0

    class Solution {private char[][] grid;private int row, col;public int numIslands(char[][] grid) {this.grid = grid;row = grid.length;col = grid[0].length;int ans = 0;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)if (grid[i][j] == '1') {dfs(i, j);ans++;}return ans;}void dfs(int i, int j) {if (i >= row || i < 0 || j < 0 || j >= col || grid[i][j] == '0') {return;}grid[i][j] = '0';dfs(i + 1, j);dfs(i - 1, j);dfs(i, j + 1);dfs(i, j - 1);}}

思路:使用bfs,将已经访问节点置位0

import java.util.LinkedList;
import java.util.Queue;/*** @author hsc* @date 2022/5/22 4:20 下午*/
class Solution {private char[][] grid;private int row, col;public int numIslands(char[][] grid) {this.grid = grid;row = grid.length;col = grid[0].length;int ans = 0;for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)if (grid[i][j] == '1') {bfs(i, j);ans++;}return ans;}void bfs(int i, int j) {Queue<Integer> queue = new LinkedList<>();grid[i][j] = '0';queue.add(col * i + j);while (!queue.isEmpty()) {Integer id = queue.poll();int r = id / col;int c = id % col;if (r - 1 >= 0 && grid[r - 1][c] == '1') {queue.add((r - 1) * col + c);grid[r - 1][c] = '0';}if (r + 1 < row && grid[r + 1][c] == '1') {queue.add((r + 1) * col + c);grid[r + 1][c] = '0';}if (c - 1 >= 0 && grid[r][c - 1] == '1') {queue.add(r * col + c - 1);grid[r][c - 1] = '0';}if (c + 1 < col && grid[r][c + 1] == '1') {queue.add(r * col + c + 1);grid[r][c + 1] = '0';}}}}

参考文献:
[1]https://www.geeksforgeeks.org/breadth-first-search-or-bfs-for-a-graph/
[2] https://en.wikipedia.org/wiki/Breadth-first_search
[3]https://en.wikipedia.org/wiki/Depth-first_search

深度优先搜索广度优先搜索相关推荐

  1. 6.1 图的深度优先和广度优先搜索

    图的广度优先搜索 图的的搜索算法主要分为广度优先搜索(breadth-first search或BFS)和深度优先搜索(depth-first search或DFS).首先讨论广度优先搜索算法. 称之 ...

  2. 图的遍历——深度优先搜索+广度优先搜索

    一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...

  3. Python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  4. 邻接矩阵的深度优先和广度优先搜索

    c语言中图的邻接矩阵的深度优先和广度优先搜索 #include<stdio.h> #include<stdlib.h> typedef struct {int vexs[7]; ...

  5. 深度优先和广度优先搜索

    目录 前言 1 深度优先搜索 2 广度优先搜索 3 深度优先和广度优先的比较 前言 最近面试,被问到了深度优先和广度优先搜索,这个我似曾相识,曾经大学的时候学到过,但是由于这几年的工作都未接触到,所以 ...

  6. 深度优先搜索 广度优先搜索理解

    深度优先搜索广度优先搜索 1. 什么是 "搜索" 算法 我们知道,算法都是作用于某种具体的数据结构上的,而深度优先搜索算法和广度优先搜索算法就是作用于图这种数据结构的. 图上的搜索 ...

  7. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  8. 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

    度:某个顶点的度就是依附于该顶点的边的个数 子图:一幅图中所有边(包含依附边的顶点)的子集 路径:是由边顺序连接的一系列定点组成 环:至少含有一条边且终点和起点相同的路径 连通图:如果图中任一个到另一 ...

  9. 深度优先搜索/广度优先搜索

    来源 深度优先搜索算法:(DFS) 是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程 ...

最新文章

  1. 寻找调用DebugPort的函数
  2. Mybatis入门及于hibernate的区别
  3. Dora.Interception,为.NET Core度身打造的AOP框架:全新的版本
  4. 数据结构与算法-- 广度优先打印二叉树
  5. Windows Dos命令下查看端口号,杀死端口
  6. PyTorch实战福利从入门到精通之四——卷积神经网络CIFAR-10图像分类
  7. linux编程之指针
  8. UTF8下的中文截取
  9. nlp项目:搭建一个简单的问答系统
  10. 在线协作编辑算法简介- OT算法
  11. CentOS7.2下python安装pip-8.0.2管理
  12. DedeCms网站防挂马注意点
  13. 3DSMAX联机渲染、网络渲染、分布式渲染效率评测
  14. Python进行灰色关联度综合评价
  15. 507「LibreOJ NOI Round #1」接竹竿-DP
  16. 计算机无线网怎么安装教程,安装无线网必看 给家庭安装无线宽带WIFI的详细步骤(图)...
  17. java设计模式--装饰器设计模式(javaIO设计使用)
  18. 新房贷政策难执行真实原因:央行货币政策非万能
  19. 安凯AK3918E加载mtk7601驱动不能ifconfig wlan0 down
  20. Column ‘createTime’ cannot be null,could not execute statement; SQL [n/a]; constraint [null]; nested

热门文章

  1. 从互联网大厂生态长出的新业务:网易智企要做“卖水人”?
  2. 华为s5720s查看cpu使用率
  3. 【2023程序员必看】大数据行业分析
  4. 深度解析区块链架构、跨链和演进
  5. VRTK4.0 学习Day2
  6. 选择排序(JAVA实现)
  7. EasyNVR内网摄像机接入网关+EasyNVS云端管理平台,组件起一套轻量级类似于企业级萤石云的解决方案
  8. 2014 android全球用户,2014年全球Android手机出货量占比高达81.5%
  9. 普及json格式相关问题
  10. 天宇优配|前10月工业企业利润结构优化 稳增长望再发力