深度优先(DFS)和广度优先(BFS)——算法

2024-09-09 04:32
文章标签 算法 深度 bfs dfs 优先 广度

本文主要是介绍深度优先(DFS)和广度优先(BFS)——算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深度优先

深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。

沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。----《维基百科》

广度优先

广度优先搜索算法(Breadth First Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。

简单的说,广度优先搜索算法是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。借助广度优先搜索算法,可以让你找出两样东西之间的最短距离。

比较

  • 拿谚语打比方的话,深度优先搜索可以比作打破砂锅问到底、不撞南墙不回头;广度优先搜索则对应广撒网,多敛鱼
  • 两者没有绝对的优劣之分,只是适用场景不同
  • 当解决方案离树根不远或搜索深度可变时,BFS通常更好,因为只需搜索所有数据中的一部分。另外BFS的一个重要优点是它可以用于找到无权图(有权图用Dijkstra算法,贪心思想)中任意两个节点之间的最短路径(不能使用DFS)
  • 如果树比较宽而且深度有限,DFS可能是更优选项,因为DFS比BSF更节省空间,另外由于使用递归,DFS更好写(BFS必须手动维护队列)
时间复杂度

都是O(n)

空间复杂度

都是O(n)

参考

  • https://www.cnblogs.com/nkqlhqc/p/10878643.html
  • https://cloud.tencent.com/developer/article/1156139
  • https://zhuanlan.zhihu.com/p/125767384

java实现

深度优先
public class DepthFirstSearch {private int[] a, book;private int n;private int total;public DepthFirstSearch(int n) {a = new int[n + 1];book = new int[n + 1];this.n = n;total = 0;}private void dfs(int step) {if (step == n + 1) {for (int i = 1; i < a.length; i++) {System.out.print(a[i] + "\t");}System.out.println();total++;}for (int i = 1; i <= n; i++) {if (book[i] == 0) {a[step] = i;book[i] = 1;dfs(step + 1);book[i] = 0;}}}public static void main(String[] args) {DepthFirstSearch depthFirstSearch = new DepthFirstSearch(4);depthFirstSearch.dfs(1);System.out.println("total: " + depthFirstSearch.getTotal());}public int getTotal() {return total;}
}
广度优先
public class BreadthFirstSearch {Note que[] = new Note[2501];int a[][] = new int[51][51];int book[][] = new int[51][51];//方向int next[][] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};int head, tail;int k, n, m, startX, startY, p, q, tx, ty, flag;public void init() {//起始位置startX = 1;startY = 1;//目标位置p = 9;q = 9;//地图大小n = 10;m = 10;}public void find() {//队列初始化head = 1;tail = 1;//往队列插入迷宫入口坐标que[tail] = new Note();que[tail].x = startX;que[tail].y = startY;que[tail].f = 0;que[tail].s = 0;tail++;book[startX][startY] = 1;//用来标记是否到达目标点,0表示没有达到,1表示达到flag = 0;while (head < tail) {for (k = 0; k <= 3; k++) {tx = que[head].x + next[k][0];ty = que[head].y + next[k][1];//越界判断if (tx < 1 || tx > n || ty < 1 || ty > m) {continue;}//障碍物,是否在路径中判断if (a[tx][ty] == 0 && book[tx][ty] == 0) {//已经走过book[tx][ty] = 1;//插入新的点到队列中que[tail] = new Note();que[tail].x = tx;que[tail].y = ty;que[tail].f = head;que[tail].s = que[head].s + 1;tail++;}//如果到目标点了,停止扩展,任务结束,退出循环if (tx == p && ty == q) {flag = 1;break;}}if (flag == 1) {break;}//注意这地方千万不要忘记,当一个点扩展结束后,head++才能对后面的点进行扩展head++;}}public void print() {System.out.println(que[tail - 1].s);}public static void main(String[] args) {BreadthFirstSearch breadthFirstSearch = new BreadthFirstSearch();breadthFirstSearch.init();breadthFirstSearch.find();breadthFirstSearch.print();}public static class Note {//横坐标int x;//纵坐标int y;//父亲在队列中的编号int f;//步数int s;}
}

这篇关于深度优先(DFS)和广度优先(BFS)——算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150161

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d