微博、微信那个“图”怎么存放的呢?

简介: 微博、微信那个“图”怎么存放的呢?

微博、微信那个“图”怎么存放的呢?

微博、微信是两种“图”,前者的关注好友属于有向图,后者是无向图。



数据结构是为算法服务的,所以具体选择哪种存储方式,与期望支持的操作有关系,在微博中,假设我们需要支持下面几种操作:

  • 判断用户 A 是否关注了用户 B
  • 判断用户 A 是否是用户 B 的粉丝
  • 用户 A 关注用户 B
  • 用户 A 取消关注用户 B
  • 根据用户名称的首字母排序,分页获取用户的粉丝列表;
  • 根据用户名称的首字母排序,分页获取用户的关注列表

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

一个邻接表存储有向图,很容易查询某个用户关注了哪些用户,但是如果想知道某个用户被哪些用户关注,就十分困难

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

基础的邻接表不适合快速判断两个用户之间是否是关注和被关注的关系,所以可以使用改进版本,将邻接表中的链表改成支持快速查找的动态数据结构。红黑树、跳表、有序动态数据还是散列表?

因为我们需要按照用户名称的首字母排序,分页来获取用户的粉丝列表或者关注列表,用跳表这种结构再合适不过了。因为跳表的插入、删除、查找都非常高效,时间复杂度是O(logn),空间复杂度上比较高,是O(n),最重要的一点是,跳表中存储的数据本来就是有序的,分页获取粉丝列表或者关注列表,就非常高效。

对于小规模的数据,我们可以将整个社交关系存放在内存中,但是数据规模太大,我们就无法全部存储在内存中,这时候该怎么办呢

我们可以使用哈希算法将数据分片处理,将邻接表存储在不同的机器上,比如机器 A 存储顶点 1,2,3 的邻接表,在机器 B 上存储顶点 4,5 的邻接表。逆邻接表的处理方式也一样。当要查询顶点与顶点的关系时,我们利用同样的哈希算法,先定位顶点所在的机器,然后再在相应的机器上查找。

除此之外,我们还可以使用硬盘存储数据,比如使用数据库的存储方式,并在表上建立多个索引。



目录
相关文章
|
PHP
分享到微信、微博、QQ空间、QQ微博
一:分享到微信 //分享到微信$("#weixin").bind("click", function () {    var p = {        url: url,        title: title    };    var s = [];    for (var i in p) {        s.
943 0
|
安全
太原警方通过微博提醒您手机丢失如何保微信安全
  微信是我们生活的“必需品”,我们每天微信阅读超过40分钟,我们还绑定了银行卡发微信红包、微信购物,万一手机丢了,如何第一时间保障自己的微信安全?别急,看看太原警方通过官方微博发布微信安全提醒。 第一时间冻结微信账号 微信方面提醒用户,如果手机丢了,应该第一时间登录腾讯反诈骗中心110.qq.com冻结账号。
1700 0
|
Web App开发 JavaScript 前端开发
【云图】如何制作附近实体店的地图?-微信微博支付宝
原文:【云图】如何制作附近实体店的地图?-微信微博支付宝 摘要: 附近连锁店地图与全国连锁店地图,最大的区别就是: 1、附近连锁店地图需要先定位,然后搜索附近的店铺。 2、全国连锁店地图,是先选择城市,然后检索某城市内的全部门店信息。
1030 0
微博微信助力甜品店零起点日入1万
  大C是一位刚刚大四毕业的女生,读的是法律专业,并且考取了律师职业证书,可以正式到律师事务所报到实习。因为大C是个爱美的姑娘,一直对自己 的牙齿不满意,就带了牙套,成为了“牙套妹”。带牙套容易影响口齿发音,虽然可以去律所做简单的文员工作,但爱美的大C不愿意让自己带着牙套抛头露面,于 是选择了在家赋闲。
1192 0
草根玩微博 中产玩微信 土豪玩什么?支持Yo的iWatch?
  《中国新媒体发展报告(2014)》发布了一些新媒体的使用情况数据,25.6%无收入群体人数在玩微博,32.0%的微信用户属于月收入3000~5000元的中产阶层,那么土豪会玩什么新媒体呢?也许会是装有Yo的iWatch!微信公众平台开放设备接入能力,智能手环首批支持,iWatch会支持吗?(苹果手表发布了,不叫iWatch,Apple Watch!Apple Watch已向微信开放WatchKit接口?)   Yo这款app只能收发“yo”这一个单词,它好比一个未接电话或一个警报,“除了它本身存在的事实外,没有别的内容。
902 0
关于微博认证和微信认证
微博认证需要有已经认证的新浪微博或者腾讯微博账号,需要粉丝为500人以上,认证后账号将显示微博认证。认证以后功能上和没有认证并没有什么区别,但搜索的时候可以排名靠前。微信认证起初只有部分合作账号有,比如:深圳东部华侨城。
969 0
|
23天前
|
小程序 前端开发 API
微信小程序全栈开发中的异常处理与日志记录
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的异常处理和日志记录,强调其对确保应用稳定性和用户体验的重要性。异常处理涵盖前端(网络、页面跳转、用户输入、逻辑异常)和后端(数据库、API、业务逻辑)方面;日志记录则关注关键操作和异常情况的追踪。实践中,前端可利用try-catch处理异常,后端借助日志框架记录异常,同时采用集中式日志管理工具提升分析效率。开发者应注意安全性、性能和团队协作,以优化异常处理与日志记录流程。

热门文章

最新文章