范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

数据结构与算法进阶(七)图的遍历

  摘要
  图的遍历有两种方式,这两种方式和二叉树的层序遍历和前序遍历逻辑是一致的,在实现过程中使用到了队列和栈的数据结构。看本期文章相当于重温一下队列、栈和二叉树的遍历等知识。
  从图中某一个顶点出发访问图中其余的顶点,并且一个顶点只能被访问一次,这样的过程就是图的遍历。因为图中存在有向边,所以图中的顶点并不是一定会被访问到,而且在代码实现的时候,要专门过滤已经访问过的顶点。
  通常图的遍历有两个方案,一种是广度优先搜索(Breadth First Search, BFS),另外一种是深度优先搜索(Deapth First Search, DFS)。这两种方案和二叉树的层序遍历和前序遍历有很多相似的地方,感兴趣的话,可以看《数据结构与算法-基础(二十二)二叉树的非递归遍历》文章。广度优先搜索(BFS)
  广度优先搜索相当于一层一层的遍历,先访问这个顶点直接相连的顶点,再访问直接相连顶点的直接相连顶点,直到没有可以被访问的顶点为止。
  如果是有向图,那么只能访问这个顶点指向的顶点,不可以访问指向自己的顶点。
  如上图所示,左侧是无向图,右侧是有向图。以顶点 F 为例,分别在有向图和无向图中的广度优先搜索的顺序如下表:
  层级
  无向图
  有向图
  第一层
  F
  F
  第二层
  B、A、E
  A、E
  第三层
  C、D
  C、D
  第四层
  D
  G
  看表中的有向图访问顺序,可以看到顶点 B 没有被访问到,这也呼应文章开始的结论,图中的顶点不是一定会被访问到。
  代码上可以使用队列存放即将被遍历的顶点,当每访问一个顶点,就将该顶点的出度边连接的顶点存放在队列中,队列的 FIFO 特性就可以保证每一层能够完全被访问到(这和二叉树的层序遍历逻辑一致),代码如下:public void bfs(V begin) {     Vertex beginVertex = vertices.get(begin);     if (beginVertex == null) return;      // 保存已经入队的,即会被访问到的顶点     Set> visitedVertices = new HashSet<>();     // 队列     Queue> queue = new LinkedList<>();     queue.offer(beginVertex);     visitedVertices.add(beginVertex);     while (!queue.isEmpty()) {         Vertex vertex = queue.poll();         System.out.println(vertex.value);         for (Edge edge : vertex.outEdges) {             if (visitedVertices.contains(edge.to)) continue;             queue.offer(edge.to);             visitedVertices.add(edge.to);         }     }             }
  代码中可以看到,visitedVertices 中存放已经入队的顶点,在下面查找顶点中过滤掉已经入队的顶点,防止重复访问同一个顶点。还有需要留意的点,就是入队的都是出度集合中边的结束顶点,这个边的起始顶点就是自身,所以没有必要再入队。深度优先搜索(DFS)
  深度优先搜索,就是按照一个路径访问它的顶点,直到没有可以被访问的顶点时,就切换到另外一条路径继续访问,这个逻辑和二叉树的前序遍历是一样的,如下图中无向图和有向图:
  左侧是无向图,右侧是有向图,如果使用深度优先搜索访问这两个图,大致的顺序如下:
  无向图:F、B、C、G、D、E、A
  有向图:F、E、D、C、G、A
  上面的访问结果肯定不是唯一的,你也可以找出其他访问的顺序。主要思想就是沿着一条路走到黑,然后再换其他的路继续走到黑。
  实现的代码中,和广度优先搜索一样的就是创建一个集合存放将要被访问的顶点,避免重复访问。与其不同的是,这里使用栈的数据结构来访问顶点。public void dfs(V begin) {     Vertex beginVertex = vertices.get(begin);     if (beginVertex == null) return;     Set> visitedVertices = new HashSet<>();     Stack> stack = new Stack<>();      // 遍历第一个     if (visitor.visit(begin)) return;     visitedVertices.add(beginVertex);     stack.push(beginVertex);      // 遍历接下来的     while (!stack.isEmpty()) {         Vertex vertex = stack.pop();         for (Edge edge : vertex.outEdges) {             if (visitedVertices.contains(edge.to)) continue;              stack.push(edge.from);             stack.push(edge.to);             System.out.println(vertex.value);             visitedVertices.add(edge.to);             break;         }     }     }
  代码中遍历栈中的顶点时,依然是拿出顶点的出度边集合中,边的结束顶点压入栈中。需要留意的点是,在压入结束顶点之前会先压入起始顶点。是因为保证可以遍历完起始顶点的所有边,这个起始顶点已经放在将要访问的顶点集合中,也不用担心会重复遍历它。
  既然类似二叉树的前序遍历,那么另外一种遍历的实现方式也是可行的,那就是递归的方式进行遍历:void dfs(Vertex vertex, Set> visitedVertices) {     System.out.println(vertex.value);     visitedVertices.add(vertex);      for (Edge edge : vertex.outEdges) {         if (visitedVertices.contains(edge.to)) continue;         dfs(edge.to, visitedVertices);     } }总结图的遍历方式有两种,一种是广度优先搜索,另外一种是深度优先搜索;广度优先搜索是基于队列的结构实现,类似二叉树的层序遍历;深度优先搜索是基于栈的数据结构实现,类似二叉树的前序遍历;为了保证顶点只会被访问一次,需要额外创建一个集合存放将要被访问的顶点。

喂!你们公司的网站咋又找不到了?新网建站资讯一些企业往往在完成基本的网站建设和上线之后,才发现自己的网站排名那么低,去搜索引擎搜索前几页根本找不到自己网站,需要翻好几十页才能够看到。甚至经常被客户质问你们网站在哪Wolf2ResponsiveDesigner原生Mac网站设计对于网站设计师来说,一款好的网站设计软件是必不可少的,如果你用的是Mac电脑的话,这款原生的Mac网站设计软件WebsiteDesignermacWolf2ResponsiveDe如何在macOSMonterey上使用LiveText在iPhone上用Livetext从图片中提取文本似乎是最常用的功能,但在macOSMonterey上,你有成千上万张照片等着你去用。苹果的LiveText演示显示,如果你在拍照,iPhone13将于9月份发布,依然采取线上虚拟发布会形式苹果预计将在今年晚些时候举办iPhone发布会,可能是在9月份。根据最新报道,iPhone13的发布会将是一场线上虚拟发布会,而不是线下发布会。尽管做出了努力,但健康危机似乎让这一封号潮下,独立站成为跨境电商的出路新网建站资讯今年4月以来,全球最大的电商平台亚马逊掀起了一波封店潮。4月底,号称亚马逊三杰的帕柘逊首先遭遇暴击,旗下606个热卖商品被下架,大量资金遭到亚马逊冻结,损失惨重。惊讶之荣耀V40轻奢版发布,超级快充加持,超轻超薄颜值在线3月23日,深圳荣耀V40轻奢版正式发布。作为荣耀V40系列的又一力作,轻奢版延续了突破性的ID设计风格,前后采用3D曲面,保持纤薄的同时又降低了整机重量,握持感更佳搭载一块10亿荣耀Earbuds2SE上手黑白分明!降噪音质续航全在线6月16日,伴随着首款搭载高通芯片的荣耀50发布,全新TWS主动降噪耳机荣耀Earbuds2SE也正式亮相,并将于6月25日开启首销。作为入局TWS市场较早的品牌,荣耀已推出多款T深圳鼓励跨境卖家做独立站,单项补贴200万新网建站资讯8月5号,在深圳市深圳市商务局关于组织开展2021年度中央外经贸发展专项资金支持事项申报工作的通知提到,鼓励外贸企业自建独立站,最高补贴有200w。具体要求如下(1)独买个域名四个半月净赚210万,他是如何做的?新网域名资讯近日,单词组合域名worldclass。com世界级世界一流的以40万美元(约合人民币259万)的价格售出。worldclass是两个知名常用词的组合。前面的单词是wo哈雷超400万元收购品牌域名LiveWire。com新网域名资讯了解摩托车的朋友,应该对哈雷戴维森并不陌生。他们家的摩托车虽然价格昂贵,但造型炫酷,马力十足,深受年轻人喜爱。据了解,7月初哈雷戴维森宣布了其LiveWire电动摩托车AstahProfessionalformac(uml建模工具)v8。4。0激活版AstahProfessional是Mac上一款全新的轻量级UML建模工具。软件集思维导图和UML建模于一体,采用100纯JAVA构建,兼容性强,不仅能够实现分布式建模项目合并,还
为什么中国人天天用的微信,外国却没人用?为是因为有多好用,而是因为各种妈(姨妈姑妈舅妈)七姑八姨都在上面,你的朋友在上面,你的老板,你的员工。技术上超过微信也许不难,关系网要移走,几乎不可能。外国有人用外国人不喜欢用微信给宇宙增加更多维度,就能破解暗物质?美国趣味科学网站近日发表文章我们能够通过给宇宙增加更多维度来解释暗物质吗?,作者是保罗萨特。全文摘编如下宇宙学家说,暗物质可能比人想象的更怪异。他们指出,这种占宇宙质量80以上的神国产手机一般寿命是多长时间?正常情况下,电子产品的使用寿命都很久,如果不出现人为导致的损坏,并且每个几年更换一次电池的话,用个七八上十年没有太大的问题。比如我家里就有一台比较古老的华为C8600手机,记得是2实现高帧率游戏体验的实惠之选,飞利浦猛腾剑圣系列24M1N3200Z电竞显示器评测今年对于众多老平台玩家又是等等等的一年,原本赛博朋克2077和新显卡的推出,让许多老平台玩家升级硬件的欲望空前高涨。但面对硬件持续的涨价和缺芯,只能再次让陪伴多年的老搭档继续服役下realmeiQOO对比2500元档玩游戏谁最稳?国庆假期第三天,大家过得如何呢?相信不少小伙伴还在旅途中,当然也有一部分朋友和我一样,享受着宅家打游戏的快乐生活。说到玩游戏,如果说最火的游戏是王者荣耀,那么最适合游戏的手机非一众从游戏到社交,为何互联网巨头们都将元宇宙概念落在了消费者端?自从元宇宙这个概念火爆起来后,社交和游戏两大产业就找到了新的风口。不妨回想一下那些积极投身元宇宙的名字Epic,Facebook,腾讯,字节跳动他们或是游戏巨头,或是社交大佬,有的大学生创新创业大赛宠物鼠电商获佳绩舒克贝塔,两只可爱的小老鼠成为好几代人的的童年记忆。来自山东畜牧兽医职业学院的宋军洁,凭借宠物鼠电商打造宠物界新蓝海项目,获得了本届高新区大学生创新创业大赛创业企业组的第一名。宋军最高罚2000!浙江率先为快递行业立法,不送货上门可能被重罚点蓝字关注,不迷路快递业大省浙江率先为快递业发展立法。9月29日,浙江省十三届人大常委会第三十一次会议审议通过浙江省快递业促进条例(以下简称条例),将于明年3月起施行。条例明确,快无线蓝牙耳机注入潮流基因,成为礼物推荐首选一当潮流与耳机合体后10月份是老婆的生日,每年这个时候我都会很烦恼。买普通的嫌不用心,买贵的又显得有点俗。不知道买啥好的我,只能百无聊赖地在网上瞎逛。前几天无意间发现一款潮流属性的京东接班人徐磊商业史记Lex商业短评,记录动荡变化的商业事件。2021年9月6日,京东零售CEO徐雷晋升为拥有32万员工的京东集团总裁。至此,中国三大电商平台阿里巴巴京东和拼多多,创始人都开始隐一个曾经入驻美团的小老板怎么看待美团被罚34。42亿元2021年4月,市场监管总局对美团在中国境内网络餐饮外卖平台服务市场滥用市场支配地位行为立案调查。10月8日,市场监管总局依法作出行政处罚决定,责令退还独家合作保证金12。89亿元