深度优先搜索广度优先搜索

article/2025/9/13 1:37:35

1 概述

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

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

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

图2-1

算法描述:
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


http://chatgpt.dhexx.cn/article/Yk368ntF.shtml

相关文章

邻接矩阵的深度优先搜索技术

概述 深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;&#xff0c;是最常见的图搜索方法之一。深度优先搜索沿着一条路径一直走下去&#xff0c;无法行进时&#xff0c;回退回退到刚刚访问的结点&#xff0c;似不撞南墙不回头&#xff0c;不到黄河不死…

图-深度优先遍历

概述 深度优先遍历&#xff0c;从初始访问结点出发&#xff0c;初始访问结点可能有多个邻接结点&#xff0c;深度优先遍历的策略就是首先访问第一个邻接结点&#xff0c;然后再以这个被访问的邻接结点作为初始结点&#xff0c;访问它的第-一个邻接结点&#xff0c;可 以这样理解…

深度优先搜索python

深度优先搜索 概念 深度优先搜索和广度优先搜索一样&#xff0c;都是对图进行搜索的算法&#xff0c;目的也都是从起点开始搜索直到到达指定顶点&#xff08;终点&#xff09;。深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止&#xff0c;然后再折返&#xff0c;…

DFS——深度优先搜索

什么是DFS DFS&#xff0c;中文名深度优先搜索&#xff0c;是一种图的搜索方式&#xff0c;本质上是一种递归。 dfs相当自由&#xff0c;学dfs可能最高境界就和打太极似的&#xff0c;无招胜有招 DFS的经典应用&#xff1a; 1.全排列 虽然感觉没有贴题目的必要 这应该是大多数d…

算法详解之深度优先搜索算法

14天阅读挑战赛 文章目录 1、深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;介绍2、深度优先搜索算法思想3、深度优先搜索算法步骤&#xff1a;4、深度优先搜索算法的应用 1、深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09…

第七章:深度优先搜索

不撞南墙不回头-深度优先搜索 广度优先搜索BFS是每次将当前状态能够一步拓展出的所有状态&#xff0c;全部拓展出来依次存入队列。而深度优先搜索是将当前状态按照一定的规则顺序&#xff0c;先拓展一步得到一个新状态&#xff0c;再对这个这个新状态递归拓展下去。如果无法拓…

Java实现深度优先搜索

Java实现深度优先搜索 图的遍历 图的遍历就是访问图中的每个节点并且每个节点只访问一次。但图中有那么多节点&#xff0c;要如何进行访问就是一个问题&#xff0c;所以我们需要有特定的策略来进行访问这些节点。图的访问策略一般有两种&#xff1a;深度优先搜索和广度优先搜…

深度优先搜索

深度优先搜索&#xff1a; 深度优先搜索是对先序遍历的一般化。我们从某个节点开始&#xff0c;先处理&#xff0c;并将标记为已知&#xff0c;然后任意选择的一个邻接顶点&#xff0c;对其进行深度优先搜索&#xff0c;这样就递归的遍历了图的所有顶点。当图中有圈时&#xf…

【基础知识】一文看懂深度优先算法和广度优先算法

概览 先上个图 现在我们要访问图中的每个节点&#xff0c;即图的遍历。 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发&#xff0c;按照某种搜索方法沿着图的边访问图中的所有顶点&#xff0c;使每个顶点仅被访问一次&#xff…

深度优先搜索(DFS),看这一篇就够了。

一&#xff0c;定义&#xff1a; 深度优先搜索的思路和树的先序遍历很像&#xff0c;下面是百度百科上的定义&#xff1a; 深度优先遍历图的方法是&#xff0c;从图中某顶点v出发&#xff1a; &#xff08;1&#xff09;访问顶点v&#xff1b; &#xff08;2&#xff09;依次从…

Python实现深度优先遍历(DFS)和广度优先遍历(BFS)

一&#xff0c;简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法&#xff0c;生产上广泛用于拓扑排序&#xff0c;寻路(走迷宫)&#xff0c;搜索引擎&#xff0c;爬虫等&#xff0c;也频繁出现在 leetcode&am…

算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

1. 深度优先搜索简介 深度优先搜索算法&#xff08;Depth First Search&#xff09;&#xff1a;英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先&#xff0c;就是说每次都尝试向更深的节点走。 深度优先搜索采用了回溯思想&#xff0c;该算法沿着树的深度遍历树的节…

【新书速递】实用安全多方计算导论

安全多方计算&#xff08;MPC&#xff09;是解决数据安全与隐私保护问题的关键安全数据交换技术&#xff0c;近年来发展迅速&#xff0c;但由于MPC涉及复杂的密码学和工程实现技术&#xff0c;行业长期缺乏同时具备MPC研究、应用和实现能力的综合性人才&#xff0c;这阻碍了MPC…

百万富翁问题--安全多方计算

百万富翁问题—安全多方计算 是由图灵奖获得者姚期智提出的。 有A、B两个富翁&#xff0c;A资产i亿元&#xff0c;B资产j亿元&#xff0c;i、j均在0-10范围内&#xff0c;在互不让对方知道自己资产的情况下&#xff0c;比较A和B的资产谁多谁少。 那么如何去比较呢&#xff1f;…

隐私保护技术之安全多方计算

安全多方计算(Secure Multi-Party Computation&#xff0c;SMPC)用于解决一组互不信任的参与方各自持有秘密数据&#xff0c; 协同计算一个既定函数的问题。安全多方计算在保证参与方获得正确计算结果的同时&#xff0c;无法获得计算结果之外的任何信息。 在整个计算过程中&…

基于同态加密体制的安全多方计算

本文首发公众号VenusBlockChain&#xff0c;关注公众号后可免费阅读&#xff01;VenusBlockChain致力于区块链技术研究&#xff0c;传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们&#xff0c;欢迎关注。 安全多方计算&#xff08;Secure Mu…

多方安全计算

说明&#xff0c;本文是转载的&#xff0c;个人觉得作者讲解清晰明了&#xff0c;收录用于学习&#xff0c;原文链接&#xff1a;https://blog.csdn.net/yuxinqingge/article/details/104588197。 如今&#xff0c;互联网已经完成了从IT时代向DT时代转变&#xff0c;数据已经成…

多方安全计算MPC

1.多方安全计算的价值 MPC是密码学的一个重要分支&#xff0c;旨在解决一组互不信任的参与方之间保护隐私的协同计算问题&#xff0c;为数据需求方提供不泄露原始数据前提下的多方协同计算能力。 在目前个人数据毫无隐私的环境下&#xff0c;对数据进行确权并实现数据价值显得…

安全多方计算(MPC)

MPC既适用于特定的算法&#xff0c;如加法、乘法、AES&#xff0c;集合交集等&#xff1b;也适用于所有可表示成计算过程的通用算法。 根据计算参与方个数不同&#xff0c;可分为只有两个参与方的2PC和多个参与方&#xff08;≥3&#xff09;的通用MPC 1&#xff09;安全两方&a…

安全多方计算之二:一文搞懂百万富翁问题

百万富翁问题 1. 解决方案2. 协议描述3. 协议说明4. 协议举例5. 协议扩展 两个百万富翁Alice和Bob想知道他们两个谁更富有&#xff0c;但他们都不想让对方及其他第三方知道自己财富的任何信息&#xff0c;这是由中国计算机科学家、2000年图灵奖获得者姚启智教授于1982年在论文《…