一、图的应用场景:
- ⽹络爬⾍;
- 地图应⽤:⾼德地图,百度地图(最近距离推荐,最短时⻓推荐);
- 社交⽹络分析:好友推荐,垃圾⽤户分析,社交关系分析(好友亲密度);
- 推荐、精准营销;
- 舆情控制,信息传播;
- 防欺诈(⽹络诈骗和电信诈骗);
- 计算⽣物学:模拟分⼦运动;
二、图的分类:
- (1)有向图: 全部边为有向边所构成的图称为有向图
应用:例如抖音用户关注博主(单向:用户关注博主,博主不关注用户)
- (2)无向图: 全部边为无向的边所构成的图称为无向图
- (3)权重图: 每条边上带有两个顶点之间的权重数字
权重数字通常由深度学习和机器学习计算出来。
应用:(1)QQ好友之间的请密度
(2)地图软件的上所用的图基本上都是权重图,权重数字可以用来计算两地之间的最短路径等信息。
又分为有向权重图和无向权重图,下图所示为有向权重图。
三、图的基本概念:
-
顶点集合(vex-set):如上图 S(vex) = {'A', 'B', 'C', 'D', 'E', 'F'}
-
边集合(arc-set):如上图 S(arc) = {<'A', 'B'>, <'A', 'C'>, <'A', 'D'>, <'B', 'F'>, <'B', 'C'>, <'C', 'E'>, <'D', 'E'>, <'E', 'F'>}
-
度(degree):⽆向图中从⼀个点延伸出去的边数就是该点的度;有向图中包含出度和⼊度;
-
出度(out-degree):有多少条边指向某点就是该点的出度;
-
⼊度(in-degree):有多少条边从另一个顶点有线连接到该点就是该点的入度;
例如C的入度是1,出度是2
四、图的存储:
图存储的关键是点集合和边集合。
- (1)用邻接矩阵存储:
上面这个图的邻接矩阵如下图所示: 默认值为0,有关系的标为1
出度:看行求和,例如c的出度 = 3
入度:看列求和,例如c 的入度= 3
这里这个图是无向的,所以出度和入度是一样的
优点:很容易算出边邻接关系;以及顶点的度(不管是出度还是⼊度);
缺点:边集合存储空间复杂度⽐较⼤,图中存在⼤量的0,空间利⽤率不⾼(尤其在点多边少的情况 下);
对于⽆向图,邻接矩阵是对称的,可以只存下半部分,如下图所示。
利用无向图的数学关系可以只存无向图的下半部分,达到提高空间利用率的目的,但是实际运用过程中不可能用邻接矩阵来存储图,因为效率太低了。
- (2)用连接表存储:
顶点集合依然存储在⼀维数组当中,边集合存储在连接表当中,能够很好的控制空间复杂度。
- 有向图:
-
无向图:
- 权重无向图:
-
优点:很容易算出邻接关系;以及节点的出度;
-
缺点:很难算出⼊度,需要遍历整张表;可以建⽴⼀张逆连接表(相当于记录⼊度的表);
五、图的遍历:
-
从图中某⼀个顶点出发,访问图中其余顶点,使每个顶点被访问⼀次且只被访问⼀次;
-
可以从图中任意⼀个顶点出发进⾏遍历;
-
需要解决的问题:
-
确定⼀条搜索路径;
-
确保每个顶点被访问到;
-
确保每个顶点只能被访问⼀次;
-
设置辅助数组visited,数组元素的初始值均为false,⼀旦遍历过就置为true;
(1)深度优先搜索:有点像二叉树的遍历,一头扎到尾,然后再回溯
应⽤:
-
检测连通分量的个数;
-
两个点是否在⼀个连通分量中;
-
检测是否构成环;从⼀个点出发能否回到出发点;
(2)广度优先搜索:按层遍历,由近到远
-
关键数据结构:队列;
-
应⽤: 游戏中找寻路径问题;
(3)迪杰斯特拉算法(dijkstra):
-
该算法主要解决最短路径问题,采⽤是贪⼼思想;
-
对象:权重图;
-
该算法核⼼思想是:每次从路径最短的点出发遍历相邻边,检测修改路径值(确保相邻点也是最短),从未被确认路径最短的顶点集合中选择最短路径的点,将该点加⼊确认路径最短的顶点集合,并将该点作为下次遍历相邻边的出发点;
-
核⼼步骤:更新,扫描,修改;
例如:
用贪心算法逐步去推算确认队列和未确认队列
最终得到整个图的最短遍历顺序为ACEDBF
所以A到F的最短路径为 A B F 12+5 =17