【摘要】 图是由边的集合和点的集合组成的。如果图的边有方向(或者说图中的顶点对是有序的)则成为有向图,如果边没有方向则称为无向图。

网上的相关教程非常多,基础知识自行搜索即可。

习题主要选自Orelly出版的《数据结构与算法javascript描述》一书。

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/graph

一.图的基本知识

基本概念

图是由边的集合和点的集合组成的。如果图的边有方向(或者说图中的顶点对是有序的)则成为有向图,如果边没有方向则称为无向图。

基本建模

图可以用来对现实中许多事物进行建模。比如交通流量,计算机网络等。

二.基本练习

  • 构建一个图的类Graph

  • 图的深度优先搜索(DFS)

深度优先搜索从起始顶点开始,直到到达最后一个顶点,然后回溯,直到遍历完随后顶点或查找到指定顶点。深度优先是应用非常广泛的基本搜索思想,往往借助栈结构来实现。demo中的dfs.js直接使用函数的调用栈来追踪搜索,如果数据量很大,则可以通过手动用一个数组来管理栈。

  • 图的广度优先搜索(BFS)

广度优先搜索从第一个顶点开始,尝试访问尽可能靠近它的顶点,搜索范围基本是逐层移动的。它的实现依靠数据结构中的队列来实现。

  • BFS查找最短路径

图最常见的操作之一就是寻找从一个顶点到另一个顶点的最短路径。书中示例中通过this.edgeTo这个数组来存储顶点的访问路径,例如w节点是通过访问v节点的临近节点时访问的,那么就执行如下赋值this.edgeTo[w] = v,并将节点标记为已访问,由于广度优先搜索逐层扩展的特性,最终通过this.edgeTo迭代显示出的路径必然是搜索中最先实现标记的路径,也就是最短的路径,所以并不需要将每次访问都记录下来最终再比较步长。

  • 拓扑排序

拓扑排序用于输出一个有向无环图所有顶点的线性序列,使之满足:

a 每个顶点只出现一次

b 若存在一条从顶点A到B的路径,那么序列中A一定出现在B前面。

书中给出的示例在输出时描述有误,导致输出结果与真实的排序是相反的,在拓扑排序时采用了栈结构,入栈顺序是反的,正确的输出顺序是按照出栈顺序来输出。

三.小结

图论是非常复杂的领域,对数学基础要求较高,感兴趣的读者可以自行继续研究。至此,基本数据结构的课就补完了,希望你也认真做了练习,完成了这个基本的扫盲过程。

来源:华为云社区  作者:大史不说话

野生前端的数据结构基础练习(8)——图相关推荐

  1. 野生前端的数据结构基础练习(7)——二叉树

    [摘要] 网上的相关教程非常多,基础知识自行搜索即可.习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 网上的相关教程非常多,基础知识自行搜索即可. 习题主要 ...

  2. 野生前端的数据结构基础练习(6)——集合

    [摘要] 集合Set是一种不包含不同元素的数据结构,主要特性包括无序性和单一性,即集合中的成员是无序的,同时也是不重复的. 网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的 ...

  3. 野生前端的数据结构基础练习(5)——散列

    网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashn ...

  4. 野生前端的数据结构基础练习(4)——字典

    [摘要] 网上的相关教程非常多,基础知识自行搜索即可.习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/d ...

  5. 野生前端的数据结构基础练习(3)——链表

    [摘要] 网上的相关教程非常多,基础知识自行搜索即可.习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/d ...

  6. 野生前端的数据结构基础练习(2)——队列

    网上的相关教程非常多,基础知识自行搜索即可. 习题主要选自Orelly出版的<数据结构与算法javascript描述>一书. 参考代码可见:https://github.com/dashn ...

  7. 【数据结构基础整理】图--06:克鲁斯卡尔算法详解

    详解最小生成树中的克鲁斯卡尔算法 0x01.关于克鲁斯卡尔算法 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.克鲁斯卡尔算法主要针对边集数组展开. ...

  8. 野生前端的数据结构练习(12)贪心算法

    参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的 ...

  9. 野生前端的数据结构练习(11)动态规划算法

    [摘要] dynamic programming被认为是一种与递归相反的技术,递归是从顶部开始分解,通过解决掉所有分解出的问题来解决整个问题,而动态规划是从问题底部开始,解决了小问题后合并为整体的解决 ...

最新文章

  1. 第1节 yarn:15、关于yarn中常用的参数设置
  2. 完整的url以及同源跨域处理
  3. Python定时任务调度——APScheduler
  4. ipad鼠标圆圈变成箭头_下一代 macOS 或将支持 Mac「投屏」到 iPad
  5. [CentOS7]安装tomcat并开启自启动
  6. docker获取数据库时间相差8小时_Docker部署服务时间相差8小时解决方法
  7. js 正则清除html格式
  8. 创建一个超链接,点击这个超链接,显示数据库中的数据信息:MVC模式查询
  9. 谈论豆瓣网捧着金饭碗要饭
  10. BP算法简单推导过程
  11. 网站安全检测:8款非常有用的免费 Web 安全测试工具
  12. 计算机中所占百分数用哪个函数,Excel中Percentrank函数的使用-计算所占百分比
  13. 水晶报表繁体转简体心得:之一 RPT文件篇
  14. linux 运行.deb,Ubuntu下如何用命令行运行deb安装包
  15. NLP最简单中文分词介绍
  16. 一、酷狗 歌词搜索 Indy TIdhttp
  17. 【单片机学习之旅】(1-2)stm32F407存储器及总线架构
  18. 【使用python和flask建个人博客】给网站增加关键字、说明以及增加京备案号和公安局备案号
  19. Linux C/C++ 学习路线
  20. 纯js 实现弹幕效果

热门文章

  1. 计算机数学渤海船舶职业学院,渤海船舶职业学院2020年高职扩招录取原则
  2. 手机远程linux桌面,centos8安装xrdp远程桌面,Android手机连接linux桌面
  3. html怎么转换成asp.net,Asp.net中将Word文件转换成HTML的方法
  4. xml的应用与dtd约束
  5. 值类型和引用类型及其区别!
  6. mysql5.6-5.7性能调优
  7. 解决mysql中表字符集gbk,列字符集Latin1,python查询乱码问题
  8. 2151: 种树 - BZOJ
  9. CLR: 那些你不知道你不知道的事情 程序集(Assembly)和模块(Managed Module)
  10. linux crontab 怎么用,Linux crontab 如何使用