搜索和遍历在图中有何区别和联系?
我们都知道有深度/广度优先搜索 和 深度/广度优先遍历,而且都称其为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
什么意思呢?相当于只给了你点与点之间的一些连接的关系,表示是否连通,这样的地图是抽象概念的,并非像搜索一样给出的是“图的样子”
所以我们在遍历一个顶点的时候,是根据这个顶点于其相连接的边来依次枚举
同时也可以看出:遍历 是线性访问
总结一下
搜索: 二维数组中存放的是 具体的地图 通过计算方向进行枚举
遍历:二维数组中存放的是 抽象的地图 根据边的存在进行枚举
而就其它而言,它们都算图论算法,并且深度优先和广度优先的思想是一样的,
只不过在枚举的时候有不同的方式,
并且搜索不仅用于图,还能用于很多其他非图的算法~~~
以上是本人阅读《算法笔记》之后产生的一些感悟,若有错误和不足,还请读者在评论区或私信留言,大家一起学习,共同进步。
学好程序和算法,走遍天下都不怕。
搜索和遍历在图中有何区别和联系?相关推荐
- 用两种遍历方法判断图中两点是否有路径
用两种遍历方法判断图中两点是否有路径(可直接测试) 邻接表.图.图的两种遍历以及图中路径的基本概念,可以去自行了解和学习(下面是代码实践)可直接在自己主机测试 #include <iostrea ...
- 有向图的广度优先遍历_图的两种遍历方式
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...
- 八数码宽度优先搜索python代码_图之遍历--广度优先遍历
何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...
- matlab两点之间的所有路径,引用 在图中搜索两点间的所有路径matlab编程
引用 在图中搜索两点间的所有路径matlab编程 2018-09-18 function possiablePaths = findPath(Graph, partialPath, destinati ...
- 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索
什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...
- 图中的搜索——dij
Dijkstra(迪杰斯特拉算法)常常用于求解图中的单点最短路径问题.其主要实现方法可拆分为两个步骤:①更新距离信息②找出当前最小路径 如下图所示,要求求出1结点到6结点的最短路径. 我们可以先定义一 ...
- 5-3 本题要求实现对图的深度优先遍历。 本题中图的表示采用邻接表表示
程序填空题 5-3 本题要求实现对图的深度优先遍历. 本题中图的表示采用邻接表表示 #include <stdlib.h> #include <stdio.h>typedef ...
- CAD中组(Group)如何应用,编组和图块有何区别?
图块大家用得都比较多了,但组(Group)用到的人并不多,因为在AutoCAD菜单里似乎找不到这个命令,在浩辰CAD倒是提供了"组工具"的工具栏,在扩展工具里,可以快速创建和分解组 ...
- 获得有向无环图中起点到终点的所有路径_力扣1514——概率最大的路径
本题主要和图的遍历求解最短路径相关,可以用 Dijkstra 或者 Bellman-Ford 算法进行解决. 原题 给你一个由 n 个节点(下标从 0 开始)组成的无向加权图,该图由一个描述边的列表组 ...
最新文章
- js页面跳转或重定向
- 独家 | 6种让Python程序变慢的坏习惯
- python扩展库简介_python非官方扩展库
- 【CyberSecurityLearning 52】Web架构安全分析(web工作机制、HTTP协议)
- leetcode-67-二进制求和
- linux逻辑分区最小值,linux 逻辑卷管理 调整分区大小
- 【TypeScript系列教程09】条件语句的使用
- HALCON学习之旅(一)
- 揭秘Product Hunt怎样运用邮件崛起
- 2020icpc赛事安排
- mysql 数据导入导出说明
- 7月30日PMP考试注意事项
- MMKV_Android数据持久化方案调研-MMKV SP REALM ROOM WCDB...
- 如何快速成为一个运维工程师
- 深入Android系统(一)Build系统
- Python绘制美女乘风破浪词云舞蹈视频
- 我的世界正版服务器客户端,我的世界1.11.2
- 【实战总结】根据地图经纬度及范围查询坐标点信息
- php不显示notice,解决PHP显示Warning和Notice等问题
- Nagios配置说明
热门文章
- localhost和127.0.0.1有什么区别?
- zabbix php问题 Call to undefined function array_column()
- iOS系统字体如何使用
- Uniapp关于 Android原生插件开发案例
- 了解.net框架 MonoRail
- c语言函数参数从右往左,C语言函数入参压栈顺序为什么是从右向左?
- docker容器时间错误解决方案
- IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总:
- 使用Remmina远程登录Ubuntu系统并实现文件共享(可实现类似Teamviewer功能)
- (附带一键脚本)Android安卓手机使用linuxdeploy做debian服务器安装homeassistant教程