目录

前言

1 深度优先搜索

2 广度优先搜索

3 深度优先和广度优先的比较


前言

最近面试,被问到了深度优先和广度优先搜索,这个我似曾相识,曾经大学的时候学到过,但是由于这几年的工作都未接触到,所以就已经忘的差不多了。这里必须重拾旧货,重新认识下深度优先搜索和广度优先搜索算法了。

1 深度优先搜索

思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。由此可见,深度优先搜索是一个递归的过程。

通俗点说就是,从初始点出发,不断向前走,如果碰到死路了,就往回走一步,尝试另一条路,直到发现了目标位置。这种不撞南墙不回头的方法,即使成功也不一定找到一条好路,但好处是需要记住的位置比较少。

2 广度优先搜索

思想:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2...的顶点。

通俗点说就是,从初始点出发,把所有可能的路径都走一遍,如果里面没有目标位置,则尝试把所有两步能够到的位置都走一遍,看有没有目标位置;如果还不行,则尝试所有三步可以到的位置。这种方法,一定可以找到一条最短路径,但需要记忆的内容会非常多。

3 深度优先和广度优先的比较

一般情况下,深度优先搜索算法占内存少但速度较慢,广度优先搜索算法占内存多但速度较快,在距离和深度成正比的情况下能较快地求出最优解。因此,当内存不够大时,为了防止内存溢出最好使用深度优先搜索算法。

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

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

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

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

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

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

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

  4. 深度优先搜索广度优先搜索

    1 概述 算法是作用于具体的数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于图这种数据结构的.主要原因是因为图的这种数据结构表达能力很强,大部分涉及搜索的场景都可以抽象成图. 图上的搜索算法 ...

  5. 31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系?

    问题导入 给你一个用户,如何找出这个用户的所有三度(其中包含一度.二度和三度)好友关系? 搜索算法 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于"图" ...

  6. 图数据结构,以及使用递归方式实现图的深度优先和广度优先遍历

    源码概览 1.GraphDemo,用于演示一个图结构以及图的遍历. 2.Graph,表示图数据结构,维护顶点的集合与边的集合,并提供广度优先遍历和深度优先遍历方法. 3.Edge<V>,表 ...

  7. 算法之深度优先、广度优先算法

    目录 前言: 搜索算法: 广度优先搜索算法 深度优先搜索算法 问题:如何找出社交网络中某个用户的三度好友关系? 总结: 参考资料: 前言: 图这种数据结构经常用于表示一个社交网络,在社交网络中有一个六 ...

  8. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

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

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

最新文章

  1. SpringBoot项目打包war部署到服务器去掉项目名所遇到的坑
  2. Servlet Listener
  3. Springboot 打包时引入外部jar
  4. 使用7z命名行备份VS项目
  5. Linux Kernel ‘_xfs_buf_find()’函数空指针引用拒绝服务漏洞
  6. 1356. Sort Integers by The Number of 1 Bits 根据数字二进制下 1 的数目排序
  7. css 可编辑,如何设置DIV可编辑
  8. Linux系统文件属性,什么是Linux系统的文件属性?
  9. 【转载】IDEA中Git的更新/提交/还原方法
  10. 【转载】正则表达式30分钟入门教程
  11. python时间序列滞后命令,时间序列-相关性和滞后时间
  12. 英语版计算机教室规章制度,计算机教室规章制度
  13. js中元素(图片)切换和隐藏显示问题
  14. 程序员撕开京东 618 大促压测的另一面 | 原力计划
  15. 数据库中数据数据初始化的好处
  16. Matlab使用for循环将多个行向量合成一个行向量或者一个多维矩阵
  17. Java学习笔记之JDBC和连接池
  18. 做小说网站运营需要注意的要素
  19. 【实践与问题解决38】win10桌面图标变成一个空白图标
  20. 字符串分隔StringUtils.delimitedListToStringArray

热门文章

  1. 如何注册apple id
  2. poi 获取excel列宽度_JAVA使用POI获取Excel的列数与行数
  3. python脚本制作deb包_Deb包的制作 | 学步园
  4. 利用51单片机霍尔水流量传感器开发水流统计水流量报警(LCD1602显示)
  5. 基于强化学习的多战机同SEAD联合作战空战辅助决策(改进版)
  6. Excel如何判断某单元格或者字符串中是否包含某些字符?
  7. 学习方法 今天的收获
  8. Ubuntu命令之alias - 设置命令的别名
  9. 计算机配置方案2018,写给设计师的电脑配置攻略之PS篇 2018-08-15
  10. 手写LinKedList双向链表 终于搞清了什么是链表结构