数据结构探险之图篇

什么是图?

如下图:无向图 & 有向图
箭头分方向。
无向图中每条认为有来有回两条线

无向图&有向图

图中的概念:

有向图中的概念
  • 结点称为顶点。
  • 之间的线称为弧。
  • 弧尾和弧头(箭头)。
  • 从顶点发出去和射入的。
  • 出度:一个顶点发射出去的。& 入度:一个顶点射入的。
无向图中的概念
  • 顶点 & 边
  • 连线着的两个结点称为邻接点。
连通图

任意两个图之间都是直接或间接联通的。也就是存在路径

完全图

任意两个结点之间都有路径相互连接。就是完全图。

生成树

任意两个结点只有一个边,边数为n-1

图的表示法 & 图的遍历 & 最小生成树。

图的应用

图的基本概念及存储方式(一)

图的存储结构:

图的存储结构

无向图是由边 & 顶点组成的。 有向图是由弧 & 顶点组成

图的存储结构:

  • 邻接矩阵(数组)
  • 邻接表(链表)有向
  • 十字链表(链表)有向
  • 邻接多重表(链表)无向
弧尾&权值&弧头

邻接矩阵(数组)

有向图邻接矩阵

有弧用1,没弧用0。自身不能到自身

无向图邻接矩阵

主对角线对称。只记录一半

邻接矩阵定义为二维数组

顶点与图的结构体表示

顶点与图的结构体表示

邻接表-链式存储

邻接表-链式存储

通过一个顶点索引,找到出弧链表头指针。然后找到下一个节点。下一个节点又可以找到出弧。

链式存储
  • 弧指针,1代表索引。2代表索引。说明v1既有弧指向v2又有指向v3。又有指向v4。
  • v2 没有出度直接指向NULL
  • v3 有一条指向v4的弧。
  • v4 有指向v1的边。

邻接表记录出弧,逆邻接表记录入弧的
弧头改为弧尾。

数据结构代码体现:

弧代码体现
struct Map
{顶点数组;
};

十字链表-链式存储

十字链表表示法
十字链表弧表示
十字链表节点表示
struct Map
{顶点数组;
};

邻接多重表-链式存储(无向图)

邻接多重表-无向图
邻接多重表数据结构表示

图的遍历

  • 深度优先搜索
  • 广度优先搜索
图的深度 & 广度

深度:a-b-c-e-f-d-g-h(前序遍历:根左右)

去掉成环的边

广度优先搜索:一层一层搜索

丢弃两条边

不同的遍历方式形成不同的生成树。

最小生成树

权重 & 最小生成树

有a.b.c.e.f六个城市修路,权值为成本。a修到b,不如a-f-b
希望得到的结果是如右图

最小生成树算法:

  • 普里姆(Prim)算法
  • 克鲁斯卡尔(Kruskal)算法
Prim算法基本思想
  • 先有一个点的集合。这个点的集合是纳入最小生成树的点的集合,
  • 还要有一个边的集合。这个边的集合也是纳入最小生成树的边的集合
  • 待选边集合:当我们选定一个顶点,该顶点可以走的边的集合

假设从a开始做最小生成树。从a出去有三条待选边。a-b(6)、a-f(1)、a-e(5)。在待选边集合中找到权值最小的边。

a-f再次选择

将a-f所有的边都归入待选边集合中。再次选取最小权值边。

b纳入点集合
循环结果

最终点变成全集。边集合就成了最小连接边的集合。生成最小生成树。

克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔算法
  • 把所有边放入待选边集合中。在所有边中选取一条权值最小的边。
  • 把该边放入已选边集合中,选定了边就是选定了涉及的点。
  • 然后载待选边集合中选次小的边。f-b/d-e权值为2都可以选。
  • 判断有没有和原来的边形成闭环。形成闭环就抛弃掉该边
两个集合

选出f-d边之后。两集合变成一个集合。

要求

所有的点被涉及,并且已经纳入同一个集合。

数据结构探险之图篇(上)理论篇相关推荐

  1. RabbitMQ学习总结 第一篇:理论篇

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  2. 网站每天更新几十篇上百篇文章是怎么做到的?

    常常看到有的人在与seo相关的交流论坛上面发表一些关于自己对于seo的经验之谈,有时候会看到文章里面提到说自己每天可以发布几十上百篇文章内容,可能这会让一些新手站长们觉得看不懂,一个网站每天更新这么多 ...

  3. 数据结构基础之图(上):图的基本概念

    转自:http://www.cnblogs.com/edisonchou/p/4672188.html 图(上):图的基本概念 前面几篇已经介绍了线性表和树两类数据结构,线性表中的元素是"一 ...

  4. 啤酒和尿不湿?购物篮分析、商品关联分析和关联规则算法都给你搞清楚(上—理论篇)

    不管是不是搞数据分析的,相信应该都听过啤酒尿不湿的故事,说的是美国的沃尔玛超市管理人员分析销售数据时发现了一个令人难以理解的现象:"啤酒"与"尿布湿"这两件看上 ...

  5. ArcGIS从全国县界中提取江浙沪皖地级市图——续上一篇(提取县界图那篇)

    抱歉抱歉,时间不够,不然就与上面那篇文章合并了.下面提取地级市图是在提取县界图的基础上进一步操作的,所以所有图标续上一篇文章中的图. 这副图7是上篇文章中提取获得的县界图,下面再进一步绘制江浙沪皖地级 ...

  6. 图神经网络入门(理论篇)

    图(Graph) 图结构是一种在我们日常生活中常见的结构,很多问题本质上都是图,比如复杂的分子结构以及社交网络等等.一般来说,图最核心的两个组成部分就是节点(node)和边(edge).节点是图中的一 ...

  7. 15-数据结构探险系列-图篇

    数据结构探险之图篇 本文及代码收录于个人编程笔记(整理中,欢迎Star): https://github.com/mtianyan/Programming-Notebook 图的简介 什么是图? 如下 ...

  8. 基于pnpm + lerna + typescript的最佳项目实践 - 理论篇

    本文来自作者@金虹桥程序员 投稿 原文链接:https://juejin.cn/post/7043998041786810398 本系列文章分为两篇:理论篇和实践篇 理论篇:介绍pnpm(pnpm的特 ...

  9. 深入浅出Java线程池:理论篇

    前言 很高兴遇见你~ 借助于很多强大的框架,现在我们已经很少直接去管理线程,框架的内部都会为我们自动维护一个线程池.例如我们使用最多的okHttp以及他的封装框架Retrofit,线程封装框架RxJa ...

最新文章

  1. Go 学习笔记(49)— Go 标准库之 io/ioutil(读写文件、获取目录下的文件和子目录、创建临时目录和文件)
  2. STM32 端口复用与重映射及低功耗引脚配置
  3. MySQL中间件之ProxySQL(14):ProxySQL+PXC
  4. 在控制台环境下调用MFC DLL崩溃的问题小结
  5. Hive单用户模式搭建
  6. spring boot 整合mybatis + swagger2
  7. ubuntu下mingw32交叉编译环境搭建
  8. 中国移动(ECIA)云网工程师技术知识-立哥技术
  9. HTML5+CSS3的速查手册
  10. 【车间调度】柔性作业车间调度问题的研究现状
  11. 0003 渗透测试标准
  12. 设计师都爱用的UI标注软件有哪些?
  13. Error: Canceled future for execute_request message before replies were done
  14. 仙人掌之歌——上线运营(1)
  15. 王权理财:鹰派寒气逼人金价开启跌势,天然气跌势暂缓有望反弹拉升
  16. 【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )
  17. 【物联网】2.物联网组成三要素 - 设备/网关/服务器
  18. GSM技术类有哪些最新发表的毕业论文呢?
  19. PLSQL查询语句中日期格式使用不当会导致性能和效率很低
  20. 第1关:编写函数在结构体数组中查找数组元素

热门文章

  1. python获取网络时间_python获取网络时间和本地时间
  2. golang 监听服务的信号,实现平滑启动,linux信号说明
  3. 支付宝的个人捐赠功能
  4. eos节点服务器_EOS跌落神坛?
  5. android 软键盘 状态,Android监听软键盘状态
  6. oracle 表改表空间,Oracle批量修改用户表table的表空间
  7. 浅谈SDN中的OverLay与UnderLay技术
  8. 并发问题的解决思路以及Go语言调度器工作原理
  9. 关于STL的一些笔记
  10. kafka分区机制详解