图的基本概念

(Graph)是一种非线性数据结构。
顶点:树中的元素我们叫做节点;图中的元素我们叫做顶点(vertex)。
:图中的一个顶点可以与任意其他顶点建立关系,我们把这种建立的关系叫做边(edge)。

:以微信为例,我们可以把每个用户看成一个顶点,如果两个用户之间互加好友,那就在两者之间建立一条边。所以整个微信的好友关系就可以用一张图来表示。其中每个用户有多少个好友,对应到图中就是就叫做顶点的度(degree),即跟顶点相连接的边的条数。

  实际上,微博的好友关系跟微信不同,微博更复杂,因为微博允许单行关注,即A用户关注了B用户,但是B用户可以不关注A用户。这种关系也可以用图来表示。不过此时的关系即边是有方向的。
  如果A关注B,那么就画一条从A指向B的边。
  如果A和B互相关注,那么画一条从A指向B的边,再画一条从B指向A的边。
有向图:我们把这种边有方向的图叫做有向图,而反之边没有方向的就叫做无向图。

无向图中有度的概念,表示一个顶点有多少条边。
有向图中也有度的概念,分为入度和出度。
顶点的入度(In-degree):表示有多少条边指向这个顶点。
顶点的出度(out-degree):表示有多少条边是以这个顶点为起点指向其他顶点的。
以微博为例,入度可以表示有多少粉丝,出度可以表示自己关注了多少人。

实际上,QQ的好友关系跟微博和微信都不同,QQ有亲密度,这个亲密度其实就是图中的边的权重的概念。
带权图:在图中每条边都有一个权重(weight),可以通过这个权重来表示QQ好友间的亲密度。

图的存储

邻接矩阵存储法

图最直观的一种存储方法就是邻接矩阵存储法(Adjacency Matrix)
邻接矩阵底层依赖于一个二维数组。
  对于无向图来说,如果顶点i和顶点j之间有边,我们就将a[i][j]和a[j][i]标记为1
  对于有向图来说,如果顶点i到顶点j之间,有一条箭头从顶点i指向顶点j的边,那么我们就将
a[i][j]标记为1,同理,如果有一条箭头从顶点j指向顶点i的边,那么我们就将a[j][i]标记为1。
  对于带权图,数组中就存储相应的权重。

  使用邻接矩阵来存储图,确实很简单直接,但是非常浪费空间。
  比如对于无向图来说,如果a[i][j]=1,那么a[j][i]肯定也等于1.实际上我们只需要存储一个就可以了。也就是说,无向图中我们可以用对角线将其划分为上下两部分,那么我们只需要利用上下两部分就足够了,剩下一半就浪费了。
  还有,如果存储的图示稀疏图(Sparse Matrix),即顶点很多但是每个顶点的边并不多。这种情况下邻接矩阵存储法更加浪费空间了。
  比如说,微信用户有很多好几个亿,也就是有好几个亿的顶点,但是每个用户也就几百好友不等,那么绝大多数的存储空间就浪费了。

邻接矩阵存储法的优点:简单直接、基于数据访问友好、矩阵计算方便。

邻接表存储法

邻接表存储法(Adjacency List)跟散列表相似,如图,每个顶点对应一条链表,链表中存储的是跟这个顶点连接的其他顶点,下图是一个有向图邻接表的存储,每个顶点对应链表存储的是这个顶点所指向的其他顶点,可以用来表示自己关注的微博用户。无向图类似。


  其实邻接矩阵存储法简单直接,耗费内存,但是速度比较快。而邻接表空间利用率高但查找速度相对慢。这就是空间和时间相互交换的思想的体现。
  比如我们想确定一个顶点是否有到另一个顶点的边,利用邻接表存储方式,就得遍历原始顶点对应的那条链表。由于链表存储方式对缓存不友好,相对于邻接矩阵存储法查找效率就偏低了。但是不要紧,可以升级改造这条链表为其他支持快速crud的数据结构比如跳表、红黑树这种平衡二叉查找树等。或者改造为动态有序数组利用二分法查找定位顶点是否存在。

图的基本概念及存储方式相关推荐

  1. 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径

    文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...

  2. 【算法】图的基本介绍 以及 存储方式

    1.概述 图是一种数据结构,其中结点可以具有零个或多个相邻元素.两个结点之间的连接称为边.结点也可以称为顶点.如图: 1.1 概念 2.图的存储 图的表示方式有两种:二维数组表示(邻接矩阵) ;链表表 ...

  3. mysql中存储gis数据类型_GIS数据格式及存储方式的基本概念

    GIS概念中有相当多的数据文件格式,我们经常接触到的数据格式可以大致分为"栅格数据"与"矢量数据"这两类.这两类数据分别对应着不同的应用场景,我们通常使用&qu ...

  4. 图的两种存储方式---邻接矩阵和邻接表

    图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...

  5. *13.图的存储方式

    图的存储方式,也就是图的数据结构咯. 1.邻接矩阵.就是一个正方形矩阵.如果是无向,则是一个对阵矩阵,并且浪费资源(时间和空间).但是看得明显(即直观清楚,从哪点到哪点一看就知道),适用于稠密图(边多 ...

  6. C语言利用图的邻接矩阵的存储方式实现拓扑排序

    C语言利用图的邻接矩阵的存储方式实现拓扑排序 在拓扑排序中,我们的对象是有向无环图,这种图是描述工程进行过程的有效工具.比如"课程开课顺序,施工进程,软件开发进程",我们在使用有向 ...

  7. 数据结构 第七章 图(图的概念和存储)

    1 基本知识点 1.图:是由顶点的非空集合V和边或弧的集合E组成的,表示为G = (V,E) 2.在有向图中将边称为弧 有序对<u,v>表示一条从顶点u到顶点v的弧 u称为弧尾或起点 v称 ...

  8. 邻接矩阵的存储方式实现图的广度和深度优先遍历

    在做图的邻接矩阵之前,先做好准备工作,定义存储类型,声明队列的操作(在广度优先遍历中使用) #include <stdio.h> #include <stdlib.h> #in ...

  9. DAS、SAN、NAS三种存储方式的概念及应用

    DAS(Direct-attached Storage) 直连存储 直连式存储与服务器主机之间的连接通常采用SCSI连接,SCSI通道是IO瓶颈;服务器主机SCSI ID资源有限,能够建立的SCSI通 ...

最新文章

  1. (C++)1046 划拳
  2. 活动推荐 | 2019日立「视频分析技术黑客马拉松」报名启动,还有高额奖金等你赢...
  3. 【学术相关】目睹太多读博惨案之后,清华姚班助理教授写了个读博决策树
  4. [vue] vue开发过程中你有使用什么辅助工具吗?
  5. c语言 增删查 案例,C语言实现单链表的增删查改
  6. quickreport 加急!!!
  7. redux相关学习资源
  8. informix 计算 日期之差
  9. 分享一个好用的网页pdf打印插件
  10. java导出excel设置单元格样式_java poi批量导出excel 设置单元格样式
  11. java mis_关于使用java开发Mis系统的相关内容。
  12. 网站应用和服务器管理(课程总结4)Week12 澳大利亚维多利亚大学VIT1204 Web Application and Server Management
  13. 【语言处理与Python】2.1获取文本语料库
  14. UHL IOL NVMe测试工具安装及使用的常见问题
  15. 拉格朗日乘子法和KTT条件
  16. 图像修复(Image Restoration)
  17. 什么是内容引流?内容引流要怎么做?如何做好内容引流?
  18. WebRTC实现多人视频聊天之客户端设计
  19. Redhat 7.2操作系统上Oracle 12C R2 RAC安装配置
  20. 新媒体短视频运营加班严重么

热门文章

  1. bp神经网络原理 实现过程,BP神经网络的基本思想
  2. C#中抽象方法和虚方法的区别
  3. 企鹅电竞Web P2P实践
  4. 【Web技术】981- 手摸手之前端覆盖率实践
  5. /deep/仍无法修改el-popover样式
  6. emoji for php demo,纯微信小程序 emoji解析组件
  7. 帧动画模仿wifi链接信号
  8. 两个div如何在同一行显示
  9. 【论文翻译】VIBE 基于视频的人体3D形状和姿态估计
  10. 【SCOI2010】序列操作(求和+连续最长线段树)