如何存储微博、微信等社交网络中的好友关系?
要带着问题去学习数据结构和算法,会更高效,其他学习方法也一样,如果没有一个好的问题,就说明没有目的,没有目的的学习,效果是非常差的,学完就忘。
问题:如何存储微博、微信等社交网络中的好友关系?
带着这个问题来学习数据结构中的图,图是一种比树更复杂的非线性结构。

如上图所示,图有顶点和边,顶点其实可以理解为社交网络中的人,如果两个顶点之间有边,说明他们是好友关系。
再复杂一些的,比如微博,粉丝的关系是单向的,A 关注了 B ,B 可以不关注 A,对应地就是有向图。

还有一种是 QQ 好友的,有个亲密度,那么就对应图中的边上有权重 。如下图所示:

这样一个,图的理解就非常清楚了。那么图有哪些存储方式呢? 存储无外科两种:一是数组,二是链表,复杂些的,就是这二者的混合。
1、数组。
使用数组来存储图的信息,也叫邻接矩阵,对就上述三种图的邻接矩阵如下图所示:

2、链表
使用链表来存储图的信息的叫邻接表。

邻接表是不是有点像散列表?每个顶点对应一条链表,链表中存储的是与这个顶点相连接的其他顶点。图中画的是一个有向图的邻接表存储方式,每个顶点对应的链表里面,存储的是指向的顶点。对于无向图来说,也是类似的,不过,每个顶点的链表中存储的,是跟这个顶点有边相连的顶点。
这两种存储方式是各有优劣。邻接矩阵存储起来比较浪费空间,但是使用起来比较节省时间。相反,邻接表存储起来比较节省空间,但是使用起来就比较耗时间。
关于图,还需要理解这样几个概念:无向图、有向图、带权图、顶点、边、度、入度、出度。
邻接矩阵存储方法的缺点是比较浪费空间,但是优点是查询效率高,而且方便矩阵运算。邻接表存储方法中每个顶点都对应一个链表,存储与其相连接的其他顶点。尽管邻接表的存储方式比较节省存储空间,但链表不方便查找,所以查询效率没有邻接矩阵存储方式高。针对这个问题,邻接表还有改进升级版,即将链表换成更加高效的动态数据结构,比如平衡二叉查找树、跳表、散列表等。
学了这么久的数据结构和算法,今天突然顿悟,基础的数据结构就是数组和链表, 而后面更加复杂的 树 队列 图 等等 都可以通过数组和链表等方式存储, 出现树 队列 图 等数据结构的原因 ,就是为了解决 部分问题处理过程中时间复杂度过高的问题, 所以数据结构就是为了算法而生的! 尤其是学习了时间复杂度过后 在工作和学习过程中 就应该分析自己的代码复杂度 以进行优化或者选择更好的数据结构和算法!这样才能写出更好的代码更好的解决问题。
生活工作中应用图的例子有很多,互联网上网页之间通过超链接连接成一张有向图;城市乃至全国交通网络是一张加权图;人与人之间的人际关系够成一张图,著名的六度分割理论据说就是基于这个得到的。
内容基于极客专栏的《数据结构与算法之差》推荐你也订阅,如果你决定购买,可以看下我之前的发文 工作后,为什么还要学习数据结构与算法(文末福利),有福利哦。
欢迎关注我的公众号,会经常分享原创干货和精品学习资源。
