一、引言

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

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

user_id follow_id
1 5
2 3
3 4
4 4
5 2

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

二、图对现实生活的表述

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

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

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

  1. 图的表示:如何存储微博、微信等社交网络中的好友关系

    微博.微信.LinkedIn 这些社交软件我想你肯定都玩过吧.在微博中,两个人可以互相关注:在微信中,两个人可以互加好友.那你知道,如何存储微博.微信等这些社交网络的好友关系吗? 这就要用到我们今天要 ...

  2. 【图的表示】:如何存储微博、微信等社交网络中的好友关系?

    微博.微信.LinkedIn 这些社交软件我想你肯定都玩过吧.在微博中,两个人可以互相关注:在微信中,两个人可以互加好友.那你知道,如何存储微博.微信等这些社交网络的好友关系吗? 这就要用到我们今天要 ...

  3. 图的表示:如何存储微博、微信等社交网络中的好友关系?

    ------ 本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 ------ 在微博中,两个人可以互相关注:在微信中,两个人可以互加好友.那你知道,如何存储微博.微信等这些社交 ...

  4. 文件夹中是微信的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的),参照笔记,求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?

    题目 文件夹中是微信的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的),参照笔记,求出哪些人两两之间有共同好友,及他俩的共同好友都有谁? 本题声明: 1.采用Lin ...

  5. mysql好友关系数据表设计_社交系统中用户好友关系数据库设计

    基础分析 第一步,有一张用户表,表内包含用户的基本信息,比如账号.姓名.性别等信息.这里用tb_user表示用户信息表. ID用户名 1张三 2李四 3王五 4赵六 第二步,需要将用户与用户直接建立好 ...

  6. 30 | 图的表示:如何存储微博、微信等社交网络中的好友关系?

    列出功能需求->翻译成逻辑算法->抽象出数据结构->确定物理存储结构 后面的不会脱离前面的独立存在,只存在于工作流的运用中,所以不能把它们独立地看. 问题引入 在微博中,两个人可以互 ...

  7. 数据结构---图的表示:如何存储微博、微信等社交网络中的好友关系?

    如何理解"图" (graph) 先来了解一下图的几个概念: 顶点(vertex).边(edge).度(degree).有向图.无向图.入度(in-degree).出度(out-de ...

  8. 如何一下清空微信好友_微信通讯录中的好友,怎样全部删除?

    微信目前还没有推出批量删除微信好友的功能.现在微信的使用率如此之高,用户粘性如此之大,题主真的要把所有的微信好友都删掉吗?! 之前在其他的文章中,我们也提到过,很多人使用微信可能并不是因为自己相比于Q ...

  9. mysql好友关系数据表设计_即时通讯数据库好友关系(一对多)应该怎样设计?...

    [MYSQL里面有如下的表  user:id username photo:id name photo_favour(图片收藏关系表):photo_id user_id假设这几个表都相当大,需要进行分 ...

最新文章

  1. 和12岁小同志搞创客开发:手撕代码,做一款节拍电子鼓
  2. 【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑
  3. Nginx防盗链详细设置
  4. oracle 对象管理 01_用户及权限
  5. 安装archlinux_archlinux/manjaro 上安装percona-server
  6. Java中发送结构体
  7. 【数据结构与算法】之深入解析“课程表”的求解思路与算法示例
  8. segnet 编译与测试
  9. 每天一点点之vue框架开发 - vue坑-input 的checked渲染问题
  10. setuptools Distributing a setuptools-based project
  11. 蚂蚁金服推出分布式的图神经知识表示框架,性能和可扩展性俱佳
  12. 离职113天后,微软的“中国先生”沈向洋云受聘清华大学教授
  13. arrays中copyof复制两个数组_Java教程分享之数组知识梳理
  14. h3c交换机配置nat_H3C-NAT 命令配置
  15. The command ‘docker‘ could not be found in this WSL 2 distro.
  16. Pycharm 下载模块中出现的 Error 解决方法
  17. session有效时间问题
  18. 红帽linux配置远程连接,CentOS服务器端配置SSH远程连接的教程
  19. MAC vscode 编译多个文件失败(已解决)
  20. Fitbit协助执法部门破获一起犯罪案件

热门文章

  1. cv resource
  2. Android架构:认识简法设计与EIT软件造形(序)
  3. Basic INFO - 在命令行Build InstallShield安装包工程获得压缩安装包
  4. shiro——SimpleAuthenticationInfo中的参数
  5. 黑客攻防技术宝典Web实战篇第2版—第3章 Web应用程序技术
  6. RabbitMQ(三) HelloWorld 单生产者单消费者示例实现
  7. iphonexr电池容量_初代手机到iPhone 12,从电池容量变化看充电功率的发展
  8. docker使用网桥网络
  9. redis专题:redis键值设计、性能优化以及redis连接池配置
  10. System.getProperty(user.dir) 获取jar包所在目录