无向图(左) 有向图(右)
无权图
有权图
联通图
非联通图
这里引出联通分量、强联通分量和弱联通分量的概念。联通分量即其内部所有节点都存在路径联通,不存在“孤岛”情况,对联通图而言,联通分量只有一个,就是其本身,一个联通分量是一个天然的社群。
强联通分量指在有向图中,联通分量中的节点之间都存在双向边,一旦存在一对节点之间不是双向关系,那就是弱联通分量,对于无向图而言,由于其边天然是双向的,因此一旦存在联通分量则必然是强联通分量。
关系总结:
复杂图是对简单图的扩展,如引入不同边的类型、边的符号、节点类型等
2.1 同构图(Homogeneous Graph) VS 异构图(Heterogeneous Graph)
与异构图相对的概念是同构图,对同构图而言,点类型+边类型=2,也即边和节点类型都只有一种,而节点或边的类型不止一种的图为异构图,点类型+边类型>2
异构图
节点之间可能存在不止一条边,如用户和商品之间的关系可以是购买、收藏、加入购物车等
多边图
某些节点上有环
有环图
如社交网络中,关注可以表示为一种正向的边权重,而拉踩、屏蔽表示为一种负向的边权重
符号图
节点和边以及其属性常常会随时间发生变化,动态图在静态图的基础上添加了时间维度的概念,可以通过在图数据中添加时间戳来间接表达动态图,或通过存储不同时间下的静态图来表示动态图
无向图
2. 有向图
在邻接矩阵中,使用行和列来表示顶点,每个单元格中表示的是两个顶点之间的权重。例如顶点A到顶点B有一条权重为5.6的边,在矩阵中A行B列位置的元素值就应该是5.6
优点:
便于判断两个顶点是否有边,只需看元素是否有值即可
适用于密集图,空间复杂度为:O(顶点个数+边的个数)
缺点:
不便于插入和删除节点,在图中插入顶点后矩阵需要重新按照新的行/列创建,然后将老的矩阵已有数据复制到新的矩阵中
不便于统计与某个顶点相连的边的数目,每次都需要遍历整个表
不适用于稀疏图,效率不如邻接表
在邻接表实现中,每一个顶点会存储一个从它这里出发的列表。
比如顶点A出发可以到B、C、D,那么A的列表中会有3条边。
优点:
便于插入和删除节点,只需要修改一下单链表即可
便于统计与这个顶点相连的边的数目,只需要看单链表的大小即可
空间效率高,空间复杂度为O(顶点个数+边的个数),更适用于表示稀疏图
缺点:
不利于判断两个顶点之间是否有边,需要花费O(顶点个数)的时间复杂度扫描邻接表
不利于统计有向图顶点的入度,对于无向图来说,顶点对应的链表长度就是该顶点的度,但是在有向图中,链表的大小只能表示出度,而求入度较困难。
边集数组是由两个一维数组构成。
一个数组存储顶点的信息
一个数组存储边的信息,每个元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。
优点:
更适合对边依次进行处理的操作场景,而不适合对顶点相关的操作
缺点:
在边集数组中要查找一个顶点的度需要扫描整个边数组,效率不高
插入删除节点需要遍历整个边数组进行删除,效率不高
(V代表顶点,E代表边):
中心性(centrality)体现了节点在网络中的重要程度,衡量指标主要包括度中心性(Degree centrality)、紧密中心性(Closeness centrality)、中介中心性(Betweenness centrality)、特征向量中心性(eigenvectorcentrality)