我们都知道有深度/广度优先搜索 和 深度/广度优先遍历,而且都称其为DFS和BFS,

那么他们在图的算法中有什么区别呢?如果没区别那肯定不会是不同的部分吧~

这篇文章就给出我的一些理解

问题的提出

今天在看算法笔记时注意到书上写的遍历方法,在枚举“方向”时,用的是这样的方式

for(int v = 0; v < n; v++){

if(vis[v] == false && G[u][v] != INF){

q.push(v);

vis[v] = true;

}

}

但是在搜索方法的时候,却是这样的写法 (例如马的遍历这一题)

for(int i = 0;i<8;i++){

nx=f.xx+Next[i][0]; ny=f.yy+Next[i][1]; step=f.steps+1;

if(book[nx][ny]==0 && nx>=1 && nx<=n && ny>=1 && ny<=m){

qipan New;

New.xx=nx; New.yy=ny; New.steps=step;

q.push(New);  book[nx][ny]=1; ans[nx][ny] = step;

}

}

首先,最明显的不同就是“方向”,在搜索时,是从4或8...个固定(上下左右)的方向进行枚举,

而在遍历时,只是通过存储的图中的边进行依次枚举。

这让我不禁思考一下,为什么不同了,又或者能互换这样的枚举方式吗?

问题的讨论

对于这样的一个“学术执着”精神,必须给它想清楚了心里才觉得踏实,于是我沉思许久。

一开始,我感觉到,是因为他们需要的枚举方向不同,所以遍历是从一个点依次判断。

但是这样都是枚举方向,为什么一个这样,另一个那样?

搜索的时候,如果也用G[u][v]来进行DFS、BFS可以吗?

遍历的时候,如果也用NEXT[][]数组来保存方向可以吗?

想了半天好像感觉不可以。为什么不可以呢?

想通了发现,按道理是可以的,因为同样是图,所以本质是不变的,况且他们的深度优先和广度优先的思想是不变的。

但是!在图的搜索当中,我们一般是给的具体一个“图”,而图的遍历当中,我们给的是点与点之间的连接关系,所以就造成了差异!

这一点从具体的算法题也可以非常之明显地看出来!

例如:

搜索给出的数据是这样的

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

什么意思呢?这就相当于给了具体的地图是长什么样~ 也就是说,已经是形象地表现出来了地图,

从而四个(或多个)方向的枚举就是上下左右这样的方向,因此我们在搜索时是利用一个next[4][2]

这样的一个二维数组来记录方向,通过队首的坐标加以计算方向进行枚举

同时也可以看出:搜索 沿着某个路径访问

遍历给出的数据是这样的

4 3
1 2
2 4
4 3

什么意思呢?相当于只给了你点与点之间的一些连接的关系,表示是否连通,这样的地图是抽象概念的,并非像搜索一样给出的是“图的样子”

所以我们在遍历一个顶点的时候,是根据这个顶点于其相连接的边来依次枚举

同时也可以看出:遍历 是线性访问

总结一下

搜索: 二维数组中存放的是 具体的地图 通过计算方向进行枚举

遍历:二维数组中存放的是 抽象的地图 根据边的存在进行枚举

而就其它而言,它们都算图论算法,并且深度优先和广度优先的思想是一样的,

只不过在枚举的时候有不同的方式,

并且搜索不仅用于图,还能用于很多其他非图的算法~~~

以上是本人阅读《算法笔记》之后产生的一些感悟,若有错误和不足,还请读者在评论区或私信留言,大家一起学习,共同进步。

学好程序和算法,走遍天下都不怕。

搜索和遍历在图中有何区别和联系?相关推荐

  1. 用两种遍历方法判断图中两点是否有路径

    用两种遍历方法判断图中两点是否有路径(可直接测试) 邻接表.图.图的两种遍历以及图中路径的基本概念,可以去自行了解和学习(下面是代码实践)可直接在自己主机测试 #include <iostrea ...

  2. 有向图的广度优先遍历_图的两种遍历方式

    1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...

  3. 八数码宽度优先搜索python代码_图之遍历--广度优先遍历

    何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...

  4. matlab两点之间的所有路径,引用 在图中搜索两点间的所有路径matlab编程

    引用 在图中搜索两点间的所有路径matlab编程 2018-09-18 function possiablePaths = findPath(Graph, partialPath, destinati ...

  5. 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索

    什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...

  6. 图中的搜索——dij

    Dijkstra(迪杰斯特拉算法)常常用于求解图中的单点最短路径问题.其主要实现方法可拆分为两个步骤:①更新距离信息②找出当前最小路径 如下图所示,要求求出1结点到6结点的最短路径. 我们可以先定义一 ...

  7. 5-3 本题要求实现对图的深度优先遍历。 本题中图的表示采用邻接表表示

    程序填空题 5-3 本题要求实现对图的深度优先遍历. 本题中图的表示采用邻接表表示 #include <stdlib.h> #include <stdio.h>typedef ...

  8. CAD中组(Group)如何应用,编组和图块有何区别?

    图块大家用得都比较多了,但组(Group)用到的人并不多,因为在AutoCAD菜单里似乎找不到这个命令,在浩辰CAD倒是提供了"组工具"的工具栏,在扩展工具里,可以快速创建和分解组 ...

  9. 获得有向无环图中起点到终点的所有路径_力扣1514——概率最大的路径

    本题主要和图的遍历求解最短路径相关,可以用 Dijkstra 或者 Bellman-Ford 算法进行解决. 原题 给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组 ...

最新文章

  1. js页面跳转或重定向
  2. 独家 | 6种让Python程序变慢的坏习惯
  3. python扩展库简介_python非官方扩展库
  4. 【CyberSecurityLearning 52】Web架构安全分析(web工作机制、HTTP协议)
  5. leetcode-67-二进制求和
  6. linux逻辑分区最小值,linux 逻辑卷管理 调整分区大小
  7. 【TypeScript系列教程09】条件语句的使用
  8. HALCON学习之旅(一)
  9. 揭秘Product Hunt怎样运用邮件崛起
  10. 2020icpc赛事安排
  11. mysql 数据导入导出说明
  12. 7月30日PMP考试注意事项
  13. MMKV_Android数据持久化方案调研-MMKV SP REALM ROOM WCDB...
  14. 如何快速成为一个运维工程师
  15. 深入Android系统(一)Build系统
  16. Python绘制美女乘风破浪词云舞蹈视频
  17. 我的世界正版服务器客户端,我的世界1.11.2
  18. 【实战总结】根据地图经纬度及范围查询坐标点信息
  19. php不显示notice,解决PHP显示Warning和Notice等问题
  20. Nagios配置说明

热门文章

  1. localhost和127.0.0.1有什么区别?
  2. zabbix php问题 Call to undefined function array_column()
  3. iOS系统字体如何使用
  4. Uniapp关于 Android原生插件开发案例
  5. 了解.net框架 MonoRail
  6. c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?
  7. docker容器时间错误解决方案
  8. IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总:
  9. 使用Remmina远程登录Ubuntu系统并实现文件共享(可实现类似Teamviewer功能)
  10. (附带一键脚本)Android安卓手机使用linuxdeploy做debian服务器安装homeassistant教程