图 - 图基础和图存储

2020-03-26  本文已影响0人  天命_风流

树和图都是非线性表数据结构,之前我们已经学习了树,现在我们就学习更为复杂的图。

图的概念

在这里主要介绍图的类型以及关于图的一些概念,我们会使用 微信、微博、QQ 三种社交软件的社交关系作为例子帮助理解。

无向图、顶点、边、度

在树中,我们将元素成为节点,而在图中的元素,我们叫做顶点(vertex)。两个顶点之间建立的连接关系叫做边(edge)。一个顶点有多少边与之相连,成为一个顶点的度(degree)。你可以看一下下面的图:

无向图.jpg
图的应用非常广泛,上面的图是一个无向图,我们可以用它表示微信中的社交关系:每个用户看作一个顶点。如果两个用户之间互为好友,就在两者之间建立一条边。一个人有多少好友,就是该顶点的度。

有向图

微信中以互相添加好友作为建立边的原则,这种社交关系在微博中不太一样:在微博中,允许用户单向关注,即用户 A 关注了 B,而 B 不一定要关注 A。我们如何用图来表示这种关系呢?

我们需要为图引入“方向”的概念。

如果 A 关注了 B ,我们就在图中画一条从 A 到 B 的带剪头的边,使用剪头表示边的方向。我们把这种有方向边的图称作有向图。类似的,我们将之前讲到的例子称为无向图

有向图.jpg
在有向图中,我们把度分为入度 和 出度
入度:表示有多少条边指向这个顶点;
出度:标识有多少条边以这个顶点为起点指向其它顶点。

带权图

QQ中的社交关系要更复杂一些,在两个QQ好友之间会有“亲密度”这样一个功能。它不仅维护了两个用户之间的好友关系,还记录了两个用户之间的亲密度。

在图中,我们使用带权图表示这种关系。带权图中,每条边都有一个权重,我们可以通过这个权重来表示QQ好友之间的亲密度:

带权图.jpg

图的存储

图的存储可以分为两类:邻接矩阵 和 邻接表

邻接矩阵(Adjacency Matrix)

图最直观的存储方法是使用邻接矩阵。

我们用一个二维数组记录各个顶点之间的边:

图存储-邻接矩阵.jpg
邻接矩阵的优点:
邻接矩阵的缺点:

邻接表(Adjacency List)

我们有另一种存储图的方法:使用链表记录边,也就是使用邻接表。

邻接表有点像散列表,每个顶点会有一条链,链表中存储的是与这个顶点相连的其它顶点(这两个顶点之间有一条边)。下图是有向图的存储,链表中存储的顶点是指向的顶点。在无向图中的存储方式类似。 图存储-邻接表.jpg
邻接表的优点:
邻接表的缺点:

应用场景

如何存储微博的好友关系?

数据结构是为算法服务的,所以具体选择哪种存储方式,与期望的操作有关。对微博的用户关系,假设我们需要支持下面的操作:

分析和选取

综上,我们需要使用邻接表和逆邻接表作为存储的基本结构,使用跳表代替链表方便查询,使用分布式的思想保存如此庞大的数据。(有没有对这个分析过程感到神奇?)

小结


以上就是本节的内容

注:本文章的主要内容来自我对极客时间app的《数据结构与算法之美》专栏的总结,我大量引用了其中的代码和截图,如果想要了解具体内容,可以前往极客时间

上一篇 下一篇

猜你喜欢

热点阅读