数据结构算法--图详解

目录

1. 图定义

2. 图存储

3. 图遍历

深度优先遍历(DFS)

广度优先遍历(BFS)

leecode举例

4. 常见图算法

最小生成树

最短路径

随机游走

社区发现

1. 图定义

:图G由顶点集合V和边集合E组成,记为G = (V, E)

图分类:有向图和无向图。

子图G = (V, E), G' = (V', E'),如果V'\subseteq VE'\subseteq E,则G’为G的子图。

有向完全图:n(n - 1)条边的有向图。

无向完全图:n(n - 1) / 2条边的无向图。

:图的每条边带有权值。

邻接点:无向图,一条边的两点互为邻接点。

路径:顶点v到顶点v'的边的权值和为路径长度。

连通:无向图G,如果顶点v到顶点v'存在路径,则两顶点连通。 G是一个连通图, G中的极大连通子图为连通分量。

强连通图:有向图G,如果顶点v到顶点v'存在路径,则两顶点强连通。强连通图只有一个连通分量。

生成树:无向图 G,存在一个极小连通子图,如果其包含图的所有n个顶点,有且仅有n - 1条边,则称该连通子图为G的生成树。其中权值路径最小的为最小生成树。

有向树:对于有向图G,存在一个v的入度为0,其他v'的入度均为1的子图,则称该子图为G的有向树(树型图),即有向图的生成树。

2. 图存储

  • 邻接矩阵

定义:n阶矩阵,矩阵值对应每条边权重。优点:便于计算顶点之间是否有边,便于计算顶点的度。缺点:不便于增删顶点;不便于统计所有边数目;空间复杂度高。

无向图举例:

[[0, 6, 1, 5, 0, 0],
[6, 0, 5, 0, 3, 0],
[1, 5, 0, 5, 6, 4],
[5, 0, 5, 0, 0, 2],
[0, 3, 6, 0, 0, 6],
[0, 0, 4, 2, 6, 0]]
  • 邻接表

定义:链式存储。优缺点和上述邻接矩阵相反。

无向图举例:

  • 集合

定义:以(v, v', weight)形式给出。

无向图举例:

[('E', 'C', 6), ('D', 'A', 5), ('F', 'D', 2), ('A', 'B', 6), ('A', 'C', 1), ('F', 'E', 6), ('C', 'B', 5), ('C', 'D', 5), ('C', 'F', 4), ('B', 'E', 3)]
  • 文本

无向图举例

D -- F [label="2"]
D -- C [label="5"]
D -- A [label="5"]
A -- B [label="6"]
F -- E [label="6"]
C -- E [label="6"]
A -- C [label="1"]
B -- E [label="3"]
C -- B [label="5"]
F -- C [label="4"]
  • 图像

3. 图遍历

深度优先遍历(DFS)

定义:沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底

上述无向图DFS遍历:A->B->E->C->F->D

广度优先遍历(BFS)

定义:从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点

上述无向图BFS遍历:A->B->C->D->E->F

leecode举例

leecode547省份数量

leetcode200岛屿数量

4. 常见图算法

最小生成树

定义:带权无向图中,生成树是包含所有顶点的树,最小生成树边的权值之和最小。

算法:Kruskal(所有边按边权值从小到大排序;从小到大依次选择每一条边,如果这条边的两个端点不在同一个连通块,就把这条边加入到最小生成树的集合,并且合并这两个连通块;重复上述步骤,直到最小生成树中有n-1条边为止);Prim(随机选一个顶点作起点;将与起点相邻的边按边权值从小到大排序;选择权值最小的边加入到最小生成树的集合;将新顶点加入到连通块,并与它相邻的边按边权值从小到大排序,直到所有顶点都被加入到最小生成树中)

最短路径

定义:计算给定的两个顶点之间最短(最小权重和)的路径。

算法:Dijkstra(选择起点0,选择与起点相连的最小权重的顶点1,再选择与顶点1相连的最小权重的顶点2……直到到达目的地顶点)

随机游走

定义:随机游走即每过一个单位时间,游走点固定向左或向右移动一个单位。

算法:从节点出发随机游走,停留在社区内的概率高于到达社区外的。2. 重复随机游走,强化并逐渐显现社区结构。(1). 建立随机矩阵 (一个或多个顶点);(2). 以1-a随机游走到邻居,以概率a随机跳跃到图中任何顶点;(3). 得到概率分布作为下次游走的输入;(4). 重复上述步骤直到稳定;(5). 对结果矩阵进行常规聚类。

中心性

定义:中心性是判断网络中节点重要性、影响力的指标。

分类:点度中心性--用节点度衡量影响力;例如粉丝数量。中介中心性--非相邻成员位于其他成员的多条最短路径上,影响力越大。接近中心性--节点到其它节点的最短距离都很小,接近中心性越高。特征向量中心性--连接节点越重要,影响力越高。

社区发现

定义:社区--社交网络中,每个用户相当于一点,用户之间的互相关注、点赞、私信等形成了边,用户以及相互作用关系构成了一个大关系网络。在这个网络,有的用户之间的连接较为紧密,有的较为稀疏;其中连接较为紧密的可以被看成在一个社区。社区发现--在图中找到一些潜在的有特定关系的组织,也就是社区(community),即要探测网络中较为紧密的【块cluster】或是【社区community】。模块度--一种常用的衡量节点分组质量的标准,模块度越高说明所检测到的社团越符合“内紧外松”的特征,分组质量越好。

本质:节点间存在的是一种逻辑拓朴结构,即存在一种共有关系。社区中的节点只是因为逻辑上的共有关系而聚集在一起而已,彼此之间的位置也没有实际意义,而社区族群之间的分离也是表达一种逻辑上的弱共有关系。

算法:Louvain算法基于模块度,基本思想--网络中节点尝试遍历所有邻居的社区标签,选择最大化模块度增量的社区标签。此后,每个社区看成一个新节点,重复,直到木块度不在增大。

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值