数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

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

数据库存储方式的介绍
外部存储的使用
哈希算法进行数据分片
优化查询效率
跳表作为动态数据结构的选择
动态数据结构替代链表
邻接表的优点和缺点
逆邻接表的概念
无向图和有向图的表示方式
链表表示邻接表
邻接矩阵的优点和缺点
稀疏图的存储问题
无向图和有向图的表示方式
二维数组表示邻接矩阵
其他应用场景中的图的表示
大规模数据的存储问题
存储方法的选择与操作需求相关
邻接矩阵和邻接表的比较
图的概念回顾
数据分片和外部存储
改进的邻接表存储方法
邻接表存储方法
邻接矩阵存储方法
带权图的概念
有向图中的入度和出度
无向图中的度
无向图和有向图的区别
顶点和边的概念
树和图的区别
总结和思考
图的存储方法
图的概念
图的表示:如何存储微博、微信等社交网络中的好友关系?

该思维导图由 AI 生成,仅供参考

微博、微信、LinkedIn 这些社交软件我想你肯定都玩过吧。在微博中,两个人可以互相关注;在微信中,两个人可以互加好友。那你知道,如何存储微博、微信等这些社交网络的好友关系吗?
这就要用到我们今天要讲的这种数据结构:图。实际上,涉及图的算法有很多,也非常复杂,比如图的搜索、最短路径、最小生成树、二分图等等。我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的算法。

如何理解“图”?

我们前面讲过了树这种非线性表数据结构,今天我们要讲另一种非线性表数据结构,(Graph)。和树比起来,这是一种更加复杂的非线性表结构。
我们知道,树中的元素我们称为节点,图中的元素我们就叫做顶点(vertex)。从我画的图中可以看出来,图中的一个顶点可以与任意其他顶点建立连接关系。我们把这种建立的关系叫做(edge)。
我们生活中就有很多符合图这种结构的例子。比如,开篇问题中讲到的社交网络,就是一个非常典型的图结构。
我们就拿微信举例子吧。我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少个好友,对应到图中,就叫做顶点的(degree),就是跟顶点相连接的边的条数。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

社交网络中的好友关系可以使用图来表示,图是一种非线性表数据结构,其中顶点表示用户,边表示用户之间的关系。在微信、微博等社交软件中,用户之间的关系可以用图来表示,包括无向图和有向图。对于带权图,可以表示用户之间的亲密度关系。图的存储方法有邻接矩阵和邻接表两种。邻接矩阵简单直观,但浪费存储空间;而邻接表节省空间,但查询效率较低。可以通过将邻接表中的链表改成平衡二叉查找树或有序动态数组来提高查询效率。文章介绍了图的概念和存储方法,为读者提供了对社交网络关系存储的技术理解。 在社交网络中,用户之间的关系可以用图来表示,包括无向图和有向图。对于带权图,可以表示用户之间的亲密度关系。图的存储方法有邻接矩阵和邻接表两种。邻接矩阵简单直观,但浪费存储空间;而邻接表节省空间,但查询效率较低。可以通过将邻接表中的链表改成平衡二叉查找树或有序动态数组来提高查询效率。文章介绍了图的概念和存储方法,为读者提供了对社交网络关系存储的技术理解。 社交网络中的好友关系可以使用图来表示,图是一种非线性表数据结构,其中顶点表示用户,边表示用户之间的关系。在微信、微博等社交软件中,用户之间的关系可以用图来表示,包括无向图和有向图。对于带权图,可以表示用户之间的亲密度关系。图的存储方法有邻接矩阵和邻接表两种。邻接矩阵简单直观,但浪费存储空间;而邻接表节省空间,但查询效率较低。可以通过将邻接表中的链表改成平衡二叉查找树或有序动态数组来提高查询效率。文章介绍了图的概念和存储方法,为读者提供了对社交网络关系存储的技术理解。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(195)

  • 最新
  • 精选
  • Jerry银银
    地图 网络 Gradle这个编译工具,内部组织task的方式用的是有向图 Android framework层提供了一个CoordinatorLayout,其内部协调子view的联动,也是用的图

    作者回复: 👍

    2018-11-30
    17
    180
  • 黄金的太阳
    请教老师 解决现实问题的时候当存储图有多种选择,例如: 1.用邻接表自己存 2.关系型库 3.图数据库 那么这三种方式每一种的适用场景,优缺点分别是什么呢?该如何取舍

    作者回复: 1 内存中用临界表 2 要持久化存储就用数据库 2 超大图 并且涉及大量图计算。用专业的图数据库

    2018-12-04
    5
    149
  • 五岳寻仙
    课后思考题: 1. 微信好友关系存储方式。无向图,也可以使用邻接表的方式存储每个人所对应的好友列表。为了支持快速查找,好友列表可以使用红黑树存储。 2. 生活工作中应用图的例子。很多,互联网上网页之间通过超链接连接成一张有向图;城市乃至全国交通网络是一张加权图;人与人之间的人际关系够成一张图,著名的六度分割理论据说就是基于这个得到的。

    作者回复: 👍

    2018-11-30
    5
    118
  • 微418信Im团a队teapot
    微信也是有向图吧……微信单方面删除好友之后另一方仍然会显示在好友列表中的啊(俗称僵尸)

    作者回复: 哈哈,在这个问题上,从你的昵称来看,你最有发言权了。

    2019-02-08
    6
    101
  • J.Smile
    早上没事看一篇打个卡,争哥,您早上几点起床啊,感觉您平时回复好早!

    作者回复: 我6点左右起来😂

    2019-09-30
    66
  • 鹏程万里
    判断用户 A 是否关注了用户 B; 判断用户 A 是否是用户B的粉丝。这两个操作我怎么觉得是一个意思呢?

    作者回复: 好像是的 第二个应该是 判断a是否被b关注

    2018-12-03
    26
  • Monday
    第1题:使用邻接表存储,并且使用改进升级版(使用跳表或散列表等) 第2题:1)我司所开发的工作流项目描述的就是有向图。2)小到公交车/地铁网络图,大到国家的铁路分布图。3)韩国偶像局,人物之间的暗恋关系。4)ETL跑批时,各JOB之间的依赖关系。。。等等等等太多了

    作者回复: 👍

    2018-12-04
    2
    21
  • 姜戈
    有序动态数组能否讲解一下

    作者回复: 数据有序排列的动态数组

    2018-11-30
    2
    19
  • 张三丰
    稀疏图那块没看懂,为何存稀疏图浪费空间呢?

    作者回复: 因为边少 对应到矩阵里就都是0

    2018-12-21
    9
  • 小文同学
    微信的用户无向图中,首先为了节约空间,采用的要是邻接表的方式,由于数据量巨大,进一步关于存储的优化和老师文中记述的类似。 图的数据结构相对其他数据结构而言是更加贴合生活场景的,事物和联系的信息可以映射为节点和边,例如百度在地图中的寻路功能应该是要利用到节点和边权重等方面的信息,期待老师对图的用法做更深入的讲解。 最后我希望提一个关于邻接表的问题,文中邻接表中,‘节点’指向的是下一个‘节点’的信息,那么‘边’的信息应该如何保存?要是‘节点’指向的是‘边’的信息,‘边’自己又包含另一头‘节点’的下标,这样的存储方式虽然不是很直观,但是也是一种有效的存储方式。老师是否可以就‘邻接表’上‘边’的存储讲解一下?

    作者回复: 实际上 我们并不需要显示的存储边 具体存储方式你可以看下一节课开头的代码

    2018-12-02
    5
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部