算法高级(37)-微信、微博中的好友关系该如何设计?
一、引言
大家都用过各种各样的社交软件,像国人用的最多的就是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
以上这些算法都比较常见,会在后文一一介绍。
我的微信公众号:架构真经(关注领取免费资源)
参考文章
- https://www.cnblogs.com/wuhan729/p/8481498.html
- https://blog.csdn.net/qq_25800311/article/details/89810843
- https://blog.csdn.net/simanstar/article/details/78906825
算法高级(37)-微信、微博中的好友关系该如何设计?相关推荐
- 图的表示:如何存储微博、微信等社交网络中的好友关系
微博.微信.LinkedIn 这些社交软件我想你肯定都玩过吧.在微博中,两个人可以互相关注:在微信中,两个人可以互加好友.那你知道,如何存储微博.微信等这些社交网络的好友关系吗? 这就要用到我们今天要 ...
- 【图的表示】:如何存储微博、微信等社交网络中的好友关系?
微博.微信.LinkedIn 这些社交软件我想你肯定都玩过吧.在微博中,两个人可以互相关注:在微信中,两个人可以互加好友.那你知道,如何存储微博.微信等这些社交网络的好友关系吗? 这就要用到我们今天要 ...
- 图的表示:如何存储微博、微信等社交网络中的好友关系?
------ 本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 ------ 在微博中,两个人可以互相关注:在微信中,两个人可以互加好友.那你知道,如何存储微博.微信等这些社交 ...
- 文件夹中是微信的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的),参照笔记,求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?
题目 文件夹中是微信的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的),参照笔记,求出哪些人两两之间有共同好友,及他俩的共同好友都有谁? 本题声明: 1.采用Lin ...
- mysql好友关系数据表设计_社交系统中用户好友关系数据库设计
基础分析 第一步,有一张用户表,表内包含用户的基本信息,比如账号.姓名.性别等信息.这里用tb_user表示用户信息表. ID用户名 1张三 2李四 3王五 4赵六 第二步,需要将用户与用户直接建立好 ...
- 30 | 图的表示:如何存储微博、微信等社交网络中的好友关系?
列出功能需求->翻译成逻辑算法->抽象出数据结构->确定物理存储结构 后面的不会脱离前面的独立存在,只存在于工作流的运用中,所以不能把它们独立地看. 问题引入 在微博中,两个人可以互 ...
- 数据结构---图的表示:如何存储微博、微信等社交网络中的好友关系?
如何理解"图" (graph) 先来了解一下图的几个概念: 顶点(vertex).边(edge).度(degree).有向图.无向图.入度(in-degree).出度(out-de ...
- 如何一下清空微信好友_微信通讯录中的好友,怎样全部删除?
微信目前还没有推出批量删除微信好友的功能.现在微信的使用率如此之高,用户粘性如此之大,题主真的要把所有的微信好友都删掉吗?! 之前在其他的文章中,我们也提到过,很多人使用微信可能并不是因为自己相比于Q ...
- mysql好友关系数据表设计_即时通讯数据库好友关系(一对多)应该怎样设计?...
[MYSQL里面有如下的表 user:id username photo:id name photo_favour(图片收藏关系表):photo_id user_id假设这几个表都相当大,需要进行分 ...
最新文章
- 和12岁小同志搞创客开发:手撕代码,做一款节拍电子鼓
- 【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑
- Nginx防盗链详细设置
- oracle 对象管理 01_用户及权限
- 安装archlinux_archlinux/manjaro 上安装percona-server
- Java中发送结构体
- 【数据结构与算法】之深入解析“课程表”的求解思路与算法示例
- segnet 编译与测试
- 每天一点点之vue框架开发 - vue坑-input 的checked渲染问题
- setuptools Distributing a setuptools-based project
- 蚂蚁金服推出分布式的图神经知识表示框架,性能和可扩展性俱佳
- 离职113天后,微软的“中国先生”沈向洋云受聘清华大学教授
- arrays中copyof复制两个数组_Java教程分享之数组知识梳理
- h3c交换机配置nat_H3C-NAT 命令配置
- The command ‘docker‘ could not be found in this WSL 2 distro.
- Pycharm 下载模块中出现的 Error 解决方法
- session有效时间问题
- 红帽linux配置远程连接,CentOS服务器端配置SSH远程连接的教程
- MAC vscode 编译多个文件失败(已解决)
- Fitbit协助执法部门破获一起犯罪案件
热门文章
- cv resource
- Android架构:认识简法设计与EIT软件造形(序)
- Basic INFO - 在命令行Build InstallShield安装包工程获得压缩安装包
- shiro——SimpleAuthenticationInfo中的参数
- 黑客攻防技术宝典Web实战篇第2版—第3章 Web应用程序技术
- RabbitMQ(三) HelloWorld 单生产者单消费者示例实现
- iphonexr电池容量_初代手机到iPhone 12,从电池容量变化看充电功率的发展
- docker使用网桥网络
- redis专题:redis键值设计、性能优化以及redis连接池配置
- System.getProperty(user.dir) 获取jar包所在目录