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