图的基本概念及存储方式
图的基本概念
图(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的数据结构比如跳表、红黑树这种平衡二叉查找树等。或者改造为动态有序数组利用二分法查找定位顶点是否存在。
图的基本概念及存储方式相关推荐
- 数据结构(六):图的概念、存储方式、基本操作、最小生成树、最短路径、有向无环图、关键路径 | Prim、Kruskal算法 | BFS、Dijkstra、Floyd算法 | 拓扑排序 | 求关键路径
文章目录 第六章 图 一.图 (一)图的定义 (二)图逻辑结构的应用 (三)无向图.有向图 (四)简单图.多重图 (五)顶点的度.入度.出度 (六)顶点-顶点的关系描述 (七)连通图.强连通图 (八) ...
- 【算法】图的基本介绍 以及 存储方式
1.概述 图是一种数据结构,其中结点可以具有零个或多个相邻元素.两个结点之间的连接称为边.结点也可以称为顶点.如图: 1.1 概念 2.图的存储 图的表示方式有两种:二维数组表示(邻接矩阵) ;链表表 ...
- mysql中存储gis数据类型_GIS数据格式及存储方式的基本概念
GIS概念中有相当多的数据文件格式,我们经常接触到的数据格式可以大致分为"栅格数据"与"矢量数据"这两类.这两类数据分别对应着不同的应用场景,我们通常使用&qu ...
- 图的两种存储方式---邻接矩阵和邻接表
图:图是一种数据结构,由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),V表示为顶点的集 合,E表示为边的集合. 首先肯定是要对图进行存储,然后进行一系列的操作,下面对图的两种存储方式邻 ...
- *13.图的存储方式
图的存储方式,也就是图的数据结构咯. 1.邻接矩阵.就是一个正方形矩阵.如果是无向,则是一个对阵矩阵,并且浪费资源(时间和空间).但是看得明显(即直观清楚,从哪点到哪点一看就知道),适用于稠密图(边多 ...
- C语言利用图的邻接矩阵的存储方式实现拓扑排序
C语言利用图的邻接矩阵的存储方式实现拓扑排序 在拓扑排序中,我们的对象是有向无环图,这种图是描述工程进行过程的有效工具.比如"课程开课顺序,施工进程,软件开发进程",我们在使用有向 ...
- 数据结构 第七章 图(图的概念和存储)
1 基本知识点 1.图:是由顶点的非空集合V和边或弧的集合E组成的,表示为G = (V,E) 2.在有向图中将边称为弧 有序对<u,v>表示一条从顶点u到顶点v的弧 u称为弧尾或起点 v称 ...
- 邻接矩阵的存储方式实现图的广度和深度优先遍历
在做图的邻接矩阵之前,先做好准备工作,定义存储类型,声明队列的操作(在广度优先遍历中使用) #include <stdio.h> #include <stdlib.h> #in ...
- DAS、SAN、NAS三种存储方式的概念及应用
DAS(Direct-attached Storage) 直连存储 直连式存储与服务器主机之间的连接通常采用SCSI连接,SCSI通道是IO瓶颈;服务器主机SCSI ID资源有限,能够建立的SCSI通 ...
最新文章
- (C++)1046 划拳
- 活动推荐 | 2019日立「视频分析技术黑客马拉松」报名启动,还有高额奖金等你赢...
- 【学术相关】目睹太多读博惨案之后,清华姚班助理教授写了个读博决策树
- [vue] vue开发过程中你有使用什么辅助工具吗?
- c语言 增删查 案例,C语言实现单链表的增删查改
- quickreport 加急!!!
- redux相关学习资源
- informix 计算 日期之差
- 分享一个好用的网页pdf打印插件
- java导出excel设置单元格样式_java poi批量导出excel 设置单元格样式
- java mis_关于使用java开发Mis系统的相关内容。
- 网站应用和服务器管理(课程总结4)Week12 澳大利亚维多利亚大学VIT1204 Web Application and Server Management
- 【语言处理与Python】2.1获取文本语料库
- UHL IOL NVMe测试工具安装及使用的常见问题
- 拉格朗日乘子法和KTT条件
- 图像修复(Image Restoration)
- 什么是内容引流?内容引流要怎么做?如何做好内容引流?
- WebRTC实现多人视频聊天之客户端设计
- Redhat 7.2操作系统上Oracle 12C R2 RAC安装配置
- 新媒体短视频运营加班严重么