首页 > 其他分享 >图的表示:如何存储微博、微信等社交网络中的好友关系?

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

时间:2022-09-27 22:24:19浏览次数:86  
标签:存储 有向图 微信 用户 链表 微博 邻接 顶点 社交

地址:https://time.geekbang.org/column/article/70537

目录

图。实际上,涉及图的算法有很多,也非常复杂,比如图的搜索、最短路径、最小生成树、二分图等等。

如何理解“图”?

图(Graph):一种更加复杂的非线性表结构。

图的种类

我们知道,树中的元素我们称为节点,图中的元素我们就叫做顶点(vertex)。从我画的图中可以看出来,图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫做(edge)。

无向图

image

拿微信举例子吧。我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好友,对应到图中,就叫做顶点的(degree),就是跟顶点相连接的边的条数

有向图

微博的社交关系跟微信还有点不一样,或者说更加复杂一点。微博允许单向关注,也就是说,用户 A 关注了用户 B,但用户 B 可以不关注用户 A。

如果用户 A 关注了用户 B,我们就在图中画一条从 A 到 B 的带箭头的边,来表示边的方向。如果用户 A 和用户 B 互相关注了,那我们就画一条从 A 指向 B 的边,再画一条从 B 指向 A 的边。我们把这种边有方向的图叫做“有向图”。以此类推,我们把边没有方向的图就叫做“无向图”。

image

我们刚刚讲过,无向图中有“度”这个概念,表示一个顶点有多少条边。在有向图中,我们把度分为入度(In-degree)和出度(Out-degree)。

顶点的入度,表示有多少条边指向这个顶点;顶点的出度,表示有多少条边是以这个顶点为起点指向其他顶点。对应到微博的例子,入度就表示有多少粉丝,出度就表示关注了多少人。

带权图

QQ 中的社交关系要更复杂一点。不知道你有没有留意过 QQ 亲密度这样一个功能。QQ 不仅记录了用户之间的好友关系,还记录了两个用户之间的亲密度,如果两个用户经常往来,那亲密度就比较高;如果不经常往来,亲密度就比较低。如何在图中记录这种好友关系的亲密度呢?

这里就要用到另一种图,带权图(weighted graph)。在带权图中,每条边都有一个权重(weight),我们可以通过这个权重来表示 QQ 好友间的亲密度。

image

存储方式

邻接矩阵存储方法

图最直观的一种存储方法就是,邻接矩阵(Adjacency Matrix)。

image

邻接表存储方法

我画了一张邻接表的图,你可以先看下。乍一看,邻接表是不是有点像散列表?每个顶点对应一条链表,链表中存储的是与这个顶点相连接的其他顶点。另外我需要说明一下,图中画的是一个有向图的邻接表存储方式,每个顶点对应的链表里面,存储的是指向的顶点。对于无向图来说,也是类似的,不过,每个顶点的链表中存储的,是跟这个顶点有边相连的顶点,你可以自己画下。

image

总结

前面我们讲到两种主要的存储方法,邻接矩阵和邻接表。因为社交网络是一张稀疏图,使用邻接矩阵存储比较浪费存储空间。所以,这里我们采用邻接表来存储。

不过,用一个邻接表来存储这种有向图是不够的。我们去查找某个用户关注了哪些用户非常容易,但是如果要想知道某个用户都被哪些用户关注了,也就是用户的粉丝列表,是非常困难的。

基于此,我们需要一个逆邻接表。邻接表中存储了用户的关注关系,逆邻接表中存储的是用户的被关注关系。对应到图上,邻接表中,每个顶点的链表中,存储的就是这个顶点指向的顶点,逆邻接表中,每个顶点的链表中,存储的是指向这个顶点的顶点。如果要查找某个用户关注了哪些用户,我们可以在邻接表中查找;如果要查找某个用户被哪些用户关注了,我们从逆邻接表中查找。

image

标签:存储,有向图,微信,用户,链表,微博,邻接,顶点,社交
From: https://www.cnblogs.com/xiayuxue/p/16736219.html

相关文章

  • 微信小程序中图片链接缓存问题如何解决
    背景描述:更换阿里云上面的图片库,打开小程序后,发现界面展示的图片还是旧图片。原因:是由于缓存导致的。解决方案:1.可以给对象存储OSS设置资源的HTTP响应头即可......
  • 微信小程序发布与支付
    一、小程序的发布流程小程序协同工作和发布官网链接1.背景小程序的平台里,开发者完成开发之后,需要在开发者工具提交小程序的代码包,然后在小程序后台发布小程序。2.......
  • php 微信支付V3API 签名生成
    classFormatter{/***GeneratearandomBASE62stringaka`nonce`,similaras`random_bytes`.**@paramint$size-Noncestringlength,......
  • 微信小程序入门介绍
    1.创建小程序项目1.申请小程序开发账号2.安装小程序开发者工具3.创建和配置小程序项目1.1注册访问https://mp.weixin.qq.com/网址,点击立即注册,选择小程序,填写......
  • 微信小程序实现与登录
    一、小程序的实现原理在小程序中,渲染层和逻辑层是分开的,双线程同时运行,渲染层和逻辑层这两个通信主体之间的通讯以及通讯主体与第三方服务器之间的通信,都是通过微信客户......
  • jquery实现点击复制微信号并自动打开微信加好友​
    近期,有建网站客户要求实现在自己的手机网站上实现点击复制微信号并自动打开微信加好友的功能。怎么在自己建网站时,制作出这样的点击复制微信号并自动打开微信加好友功能呢?......
  • 微信小程序路由跳转
    小程序路由跳转官网链接一、声明式导航在页面上声明一个<navigator>导航组件通过点击<navigator>组件实现页面跳转1.导航到tabBar页面tabBar页面指的是被配置为......
  • Swift h5 调起微信支付 并返回APP
    参考简书:https://www.jianshu.com/p/2d2237ad16d6第一步先配置URLtypes(在微信操作完成以后回到原APP)第二步直接上代码,然后再解释funcwebView(_webView:WKWebView,......
  • 微信小程序生命周期
    一、生命周期1.应用的生命周期概念:特指小程序从启动-->运行-->销毁的过程。在app.js中进行声明。常见的应用生命周期函数://app.js文件App({//小程序初始......
  • 微信小程序专题(一)-----微信后台的相关开发
    本人最近在做微信小程序后端的相关开发工作接触到微信小程序目前来讲需要两个条件1.前端通过后台服务器去调用微信平台接口,来获取openid;2.前端必须调用https跟域名......