算法高级(37)-微信、微博中的好友关系该如何设计?

一、引言

大家都用过各种各样的社交软件,像国人用的最多的就是QQ、微信、微博等,国外用的多的就是推特、脸书等,这些社交软件都是建立在人与人相互之间关系的基础上。

做过类似项目的同学,应该知道此类项目中好友之间的关系设计比较复杂,如果用传统的关系型数据库来设计,比如MySQL,那好友之间的关系需要用一张中间表来表示,如下表所示:

user_idfollow_id
15
23
34
44
52

上面这个好友关系表你可以把它看成一个二维矩阵,其实就是我们前面所学数据结构中的图。图实际上研究的是由顶点和边组成的一种数学模型,这种数学模型非常抽象,并且看起来也很枯燥。虽然图论看起来很枯燥,但是如果大家真正的深入研究下去,就会发现图论是一个非常酷的学科。世界中很多的信息之间的联系,都可以使用图这种抽象的数学方式来进行表示,如下就是表示互联网之间关系的连接图。

二、图对现实生活的表述

以图作为模型,来表示真实世界之间的关系,那么可以表示什么样的关系呢?

1.交通运输

最典型的莫过于交通运输,它可以使用图来表达,如:每个顶点可以是一个城市,每条边可以是城市之间的道路再扩展一下,每个顶点可以是一个航站楼,每条边可以是相应的航线,每个顶点可以是港口,每条边可以是相应的海运线甚至更宏观的,每个顶点可以是一个星球,每条边可以是星球之间宇宙飞船飞行的航线,亦或更微观的,每个顶点可以是城市中的一座楼,每条边可以是楼和楼之间的街道。如上,都是可以的,这是对于图来说,最直观的一种表示方式,但是,其实很多更抽象的数据关系,也可以用图来表示。

2.社交网络

对于社交网络来说,每个顶点可以表示一个人,每条边可以表示

人与人之间的关系。这种关系可以是像 FaceBook 这种好友的关

系,也可以是像 Twitter 这种关注的关系。

3.相似关系   

每个顶点可以表示一部电影,每条边可以表示两部电影之间的相似程度

4.互联网

互联网,也可以用图来表示,每个顶点可以表示一个域名,每条边可以表示域名之间的跳转或 每个顶点可以表示一个页面,每条边可以表示页面之间的连接

5.工作安排

在工作中的工作安排,也可以用图来表示,每个顶点可以是一个工作内容,每条边可以是两个工作内容之间的相关程度,或 先后执行的优先级顺序。

6.脑区活动

像脑区活动的研究这样更复杂、更专业的领域,也经常用到图,每个顶点可以是一个脑区,每条边可以是脑区之间信息的传递。

7.程序状态执行

在计算机程序中,程序状态的执行,也可以用图来表示,每个顶点可以表示一个程序状态,每条边可以表示从一种状态执行到另外一种状态。对于这种情况,最典型的一个应用就是自动机,包括制作专业的编译器,甚至是做一个游戏,都可能要设计一个自动机。在这种情况下,或多或少都会使用图论建模的方法。

三、大数据集下图算法的作用

经过前面的分析,我们看到图的作用非常大,在一个最简单的模型中,我们可以把图放在传统的关系型数据库中,也可以使用SQL语句对好友关系数据进行查询。但是像微博、微信这种体量的应用,如果还是继续使用传统数据库,那查询效率会很低,所以我们可以使用专业的图数据库来进行保存。

1.使用图保存数据的方式

邻接矩阵(Adjacency Matrix)

用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。用邻接矩阵表示图,很容易确定图中任意两个顶点是否有边相连。邻接矩阵分为有向图邻接矩阵和无向图邻接矩阵。对无向图(无向简单图)而言,邻接矩阵一定是对称的,而且对角线一定为零,有向图则不一定如此。

邻接表(Adjacency List)

邻接表描述一种紧密相关的数据结构,用于表征图。在邻接表的表示中,对于图中的每个顶点,我们将保存所有其它与之相连的顶点(即“邻接表”)。例如,由吉多·范罗苏姆提出的,使用哈希表将每个顶点和该顶点的邻接点数组关连起来,就可以看作是上述表示方法的一种实现。又如,在Cormenetal中,顶点数组的每个元素都指向一个邻接点单链表

2.使用图算法进行查询

不同图算法的时间复杂度是不同的,我们分别来看几种常见的图算法以加深印象。

  • 深度优先搜索
  • 广度优先搜索
  • A*搜索算法:启发式算法
  • 最短路径算法:Dijkstra、Bellman-Ford、Floyd-Warshall
  • 最小生成树 :Prim、Kruskal

以上这些算法都比较常见,会在后文一一介绍。


我的微信公众号:架构真经(关注领取免费资源)

参考文章

  1. https://www.cnblogs.com/wuhan729/p/8481498.html
  2. https://blog.csdn.net/qq_25800311/article/details/89810843
  3. https://blog.csdn.net/simanstar/article/details/78906825
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十步杀一人_千里不留行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值