图的概念


究竟什么是图呢?大家先来想一想咱们常用的互联网产品。

举个栗子,大家一定都用过微信,假设你的微信朋友圈中有若干好友:张三、李四、王五、赵六、七大姑、八大姨。

而你七大姑的微信号里,又有若干好友:你、八大姨、Jack、Rose。

微信中,许许多多的用户组成了一个多对多的朋友关系网,这个关系网就是数据结构当中的图(Graph)

再举一个栗子,咱们在用百度地图的时候,常常会使用导航功能。比如你在地铁站A附近,你想去的地点在地铁站F附近,那么导航会告诉你一个最佳的地铁线路换乘方案。

这许许多多地铁站所组成的交通网络,也可以认为是数据结构当中的图。

图,是一种比树更为复杂的数据结构。树的节点之间是一对多的关系,并且存在父与子的层级划分;而图的顶点(注意,这里不叫节点)之间是多对多的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。

图的术语


下面我们来介绍一下图的基本术语:

在图中,最基本的单元是顶点(vertex),相当于树中的节点。顶点之间的关联关系,被称为边(edge)

在有些图中,每一条边并不是完全等同的。比如刚才地铁线路的例子,从A站到B站的距离是3公里,从B站到C站的距离是5公里......这样就引入一个新概念:边的权重(Weight)。涉及到权重的图,被称为带权图(Weighted Graph)

还有一种图,顶点之间的关联并不是完全对称的。还拿微信来举例,你的好友列表里有我,但我的好友列表里未必有你。

这样一来,顶点之间的边就有了方向的区分,这种带有方向的图被称为有向图

相应的,在QQ当中,只要我把你从好友里删除,你在自己的好友列表里也就看不到我了。(貌似是这样)

因此,QQ的好友关系可以认为是一个没有方向区分的图,这种图被称为无向图

图的表示

邻接矩阵


拥有n个顶点的图,它所包含的连接数量最多是n(n-1)个。因此,要表达各个顶点之间的关联关系,最清晰易懂的方式是使用二维数组(矩阵)。

具体如何表示呢?我们首先来看看无向图的矩阵表示:

如图所示,顶点0和顶点1之间有边关联,那么矩阵中的元素A[0][1]与A[1][0]的值就是1;顶点1和顶点2之间没有边关联,那么矩阵中的元素A[1][2]与A[2][1]的值就是0。

像这样表达图中顶点关联关系的矩阵,就叫做邻接矩阵

需要注意的是,矩阵从左上到右下的一条对角线,其上的元素值必然是0。这样很容易想明白:任何一个顶点与它自身是没有连接的。

同时,无向图对应的矩阵是一个对称矩阵,V0和V1有关联,那么V1和V0也必定有关联,因此A[0][1]和A[1][0]的值一定相等。

那么,有向图的邻接矩阵又是什么样子呢?

从图中可以看出,有向图不再是一个对称矩阵。从V0可以到达V1,从V1却未必能到达V0,因此A[0][1]和A[1][0]的值不一定相等。

邻接矩阵的优点是什么呢?简单直观,可以快速查到一个顶点和另一顶点之间的关联关系。

邻接矩阵的缺点是什么呢?占用了太多的空间。试想,如果一个图有1000个顶点,其中只有10个顶点之间有关联(这种情况叫做稀疏图),却不得不建立一个1000X1000的二维数组,实在太浪费了。

邻接表和逆邻接表

为了解决邻接矩阵占用空间的问题,人们想到了另一种图的表示方法:邻接表。

在邻接表中,图的每一个顶点都是一个链表的头节点,其后连接着该顶点能够直接达到的相邻顶点。

很明显,这种邻接表的存储方式,占用的空间比邻接矩阵要小得多。

要想查出从顶点0能否到达顶点1,该怎么做呢?很简单,我们从顶点0开始,顺着链表的头节点向后遍历,看看后继的节点中是否存在顶点1。

要想查出顶点0能够到达的所有相邻节点,也很简单,从顶点0向后的所有链表节点,就是顶点0能到达的相邻节点。

那么,要想查出有哪些节点能一步到达顶点1,又该怎么做呢?这样就麻烦一些了,我们要遍历每一个顶点所在的链表,看看链表节点中是否包含节点1,最后发现顶点0和顶点3可以到达顶点1。

像这种逆向查找的麻烦,该如何解决呢?我们可以是用逆邻接表来解决。

逆邻接表顾名思义,和邻接表是正好相反的。逆邻接表每一个顶点作为链表的头节点,后继节点所存储的是能够直接达到该顶点的相邻顶点。

这样一来,要想查出有哪些节点能一步到达顶点1就容易了,从顶点1向后的所有链表节点,就是能一步到达顶点1的节点。

因此,我们可以根据实际需求,选择使用邻接表还是逆邻接表。

十字链表


十字链表长什么样呢?用最直观的表示,是下面这样:


如图所示,十字链表的每一个顶点,都是两个链表的根节点,其中一个链表存储着该顶点能到达的相邻顶点,另一个链表存储着能到达该顶点的相邻节点。

不过,我们没有必要把链表的节点都重复存储两次,所以简化后的十字链表如下:

图中蓝色箭头指向某顶点可到达的相邻顶点,橙色箭头指向可到达某顶点的相邻顶点,看起来可能有些乱。

总结

1.我们这一次介绍了图的定义和分类。根据图的边是否有方向,可分为有向图无向图。根据图的边是否有权重,可分为带权无权图。当然,也可以把两个维度结合起来描述,比如有向带权图,无向无权图等等。

2.图的表示方法有很多种。包括邻接矩阵、邻接表、逆邻接表、十字链表。(还有一种邻接多重表,有兴趣的小伙伴可以自学下)

—————END—————

喜欢本文的朋友们,欢迎长按下图关注订阅号程序员小灰,收看更多精彩内容

漫画:什么是 “图”?相关推荐

  1. 电子漫画系列套图更新11张,共计83张,附高清无码下载链接

    编辑:晓宇,排版:晓宇 微信公众号:芯片之家(ID:chiphome-dy) 电子漫画 电子漫画系列作品,从18年开始陆陆续续更新了多次,新关注的小伙伴可能还不知道在哪里获取,好多人在后台找我要,很多 ...

  2. 漫画人脸检测 | 全局和局部信息融合的深度神经网络(文末源码)

    人脸检测&识别依然是CV领域炙热的研究课题,不仅仅应用在各种刷脸产品,现在很多多媒体都在利用这个技术,与艺术融合,擦除不一样的火花,今天我们就来和大家分享,漫画中的人脸检测,与之前漫画人物自动 ...

  3. 基于Springboot的漫画之家管理系统

     毕业设计(论文) 题    目"漫画之家"系统 学生姓名        XXXXXXXXX 学        号       XXXXXXXXX 指导教师       XXXXX ...

  4. 「精品」板绘线稿临摹图

    漫画线稿图100张,线稿是美术学习中不可或缺的一个重要环节,简单的说线稿就是一种黑色线条,非常的便于漫画初学者临摹,很多参加漫画培训班的学生,都会经历线稿的提升训练,这些素材对大家肯定都是有帮助的! ...

  5. 全球及中国网络漫画行业发展前景及未来趋势调研报告2021年版

    2020年,全球网络漫画市场规模达到了 百万美元,预计2027年将达到 百万美元,年复合增长率(CAGR)为 % (2021-2027).中国市场规模增长快速,预计将由2020年的 百万美元增长到20 ...

  6. 全球与中国网络漫画市场行业市场规模分析及发展规划研究报告2022~2028年

    全球与中国网络漫画市场行业市场规模分析及发展规划研究报告2022-2028年 mm&m&mm鸿**m&mmm晟&mm&mm信**m&mmm合&m ...

  7. 动漫的python语言代码_由Python编写的全异步实现的动漫之家(dmzj)漫画批量下载器(爬虫)...

    DCDownloader 专注于漫画网站.图站等类似形式的内容站点的批量下载器框架. 说明 这个项目最开始是作者编写的一个仅支持某个漫画网站的批量下载器,后来有人提建议说有增加网站的需求,作者便重新梳 ...

  8. 互联网漫画2022年全球行业分析报告

    本文研究全球市场.主要地区和主要国家互联网漫画的销量.销售收入等,同时也重点分析全球范围内主要厂商(品牌)竞争态势,互联网漫画销量.价格.收入和市场份额等.   针对过去五年(2017-2021)年的 ...

  9. 漫画商城的设计与实现

     其他项目,点击作者主页  目录 1 系统简介 2 系统相关技术 2.1开发工具和开发环境介绍 2.2Django框架详述 2.3MySQL详述 3 需求分析 3.1 功能需求分析 3.2 可行性分析 ...

  10. 美国超人气漫画科普书!85%以上中学物理考点,5岁孩子秒懂物理

    ▲ 点击查看 今年的高考,不得不说,一度被浙江学霸刷屏!他总分720分,物理等3门满分的成绩,最终获得"浙江高考状元". 状元能摘得桂冠,除了日积月累的不断努力外,最重要的是,不断 ...

最新文章

  1. java与java ee_使用Java EE的ManagedExecutorService异步执行事务
  2. java jsonobject 转对象_解析JSON中JSONObject的高级使用
  3. uva 10120——Gift?!
  4. 压缩感知先进——关于稀疏矩阵
  5. [转载] java中50个关键字以及各自用法大全
  6. flutter usb串口_Flutter 踩坑记录
  7. csdn资源下载不了问题解决 360浏览器下载不了csdn资源问题解决
  8. 读书感受 之《活着》
  9. PS抠发丝简单详细方法
  10. 支持超过4000字节的varchar2类型
  11. python: 产品选型小软件
  12. 2007高考作文北京卷(II)
  13. STM32f1之L298N电机驱动+PWM调速(附主代码)
  14. php项目管理师什么,《项目管理师》填空题题目答案搜索在线
  15. JVM:7种垃圾收集器
  16. GUNS框架图片上传详解
  17. 数据库系统(DBS)2
  18. SAP 的总账和明细账
  19. 编程题目+数据库题目总结(3)
  20. 什么是无极性电解电容?

热门文章

  1. java线程栅栏_Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)
  2. mysql自旋锁_mysql 自旋锁
  3. 百度阿里网易大疆等大小厂前端校招面筋 1
  4. 天津高清卫星影像数据包下载
  5. Ruby‘s Adventrue游戏制作笔记(十四)Unity播放游戏音效
  6. JavaScript-JS判断一个整数是偶数还是奇数
  7. 如何回答「为什么想来我们公司」【面试核心问题2】
  8. detach分片表非常慢的一个案例
  9. 模型量化 pytorch2onnx
  10. 力扣 149. 直线上最多的点数