引入

社交网络,如何存储微博、微信等这些社交网络的好友关系?
==》图

一、图(Graph)的相关概念

  • :复杂的非线性表结构;
  • 顶点(vertex):图中的元素;
  • 边(edge):图中一个顶点可以与任意其他顶点建立连接关系。
  • 顶点的度(degree):与顶点相连接的边的条数
  • 无向图:边没有方向的图;
  • 有向图:边存在方向的图;
  • 有向图中度分为入度(in-degree)和出度(out-degree)
    • 入度:表示有多少条边指向这个顶点;
    • 出度:表示有多少条边是以这个顶点为起点指向其他节点。
    • 以微博为例,入度:粉丝数,出度:关注人数

  • 带权图(weighted graph):每条边都有一个权重(weight),例如:QQ好友之间的亲密度。

二、图的存储

1、邻接矩阵存储方法

  • 直观、简单、方便计算、高效获取两个顶点关系,但较为浪费存储空间(存储的是稀疏图( Sparse Matrix )、无向图只需用其对角线划分的上(下)部分就足够)。

邻接矩阵(Adjacency Matrix):一个二维矩阵。
具体来说:对于无向图来说,如果顶点 i 与顶点 j 之间有边,我们就将 A[i][j] 和 A[j][i] 标记为 1;对于有向图来说,如果顶点 i 到顶点 j 之间,有一条箭头从顶点 i 指向顶点 j 的边,那我们就将 A[i][j] 标记为 1。同理,如果有一条箭头从顶点 j 指向顶点 i 的边,我们就将 A[j][i] 标记为 1。

2、邻接表(Adjacent List)存储方法

  • 每个顶点对应一条链表,链表中存储的是与该顶点相连的其他节点;

    • 在有向图的邻接表存储方式中,每个顶点对应的链表中,存储的是指向的顶点;
    • 在无向图的邻接表存储方式中,每个顶点对应的链表中,存储的是跟该顶点有边相邻的顶点;

==》时间、空间复杂度互换的设计思想
==》邻接矩阵存储起来比较浪费空间,但是使用起来比较节省时间。相反,邻接表存储起来比较节省空间,但是使用起来就比较耗时间。

访问

eg:要确定,是否存在一条从顶点 2 到顶点 4 的边,那我们就要遍历顶点 2 对应的那条链表,看链表中是否存在顶点 4。
==》链表存储方法对缓存不友好
==》没有邻接矩阵在查询两个顶点之间的关系时那么高效。

改进:邻接表同散列表一样改进

在基于链表法解决冲突的散列表中,如果链过长,为了提高查找效率,我们可以将链表换成其他更加高效的数据结构,比如平衡二叉查找树、平衡二叉树、红黑树、跳表、散列表或有序动态数据等等。

3、分析

存储一个图主要有两种存储方法

  • 邻接矩阵
  • 邻接表

对于社交网络(稀疏图),使用邻接矩阵存储比较浪费存储空间。==》采用邻接表存储

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

  • 邻接表中,每个顶点的链表中,存储的就是这个顶点指向的顶点——如果要查找某个用户关注了哪些用户,我们可以在邻接表中查找;
  • 逆邻接表中,每个顶点的链表中,存储的是指向这个顶点的顶点。——如果要查找某个用户被哪些用户关注了,我们从逆邻接表中查找。

问题:上述的邻接表不适合快速判断两个用户之间是否是关注与被关注的关系。
==》将邻接表中的链表改为支持快速查找的动态数据结构:红黑树、跳表、有序动态数组或散列表 + 哈希算法。

十五、图(graph)相关推荐

  1. 爪哇国新游记之二十五----图及其遍历查找

    代码: import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java. ...

  2. 八十五、Python | Leetcode数据结构之图和动态规划算法系列

    @Author:Runsen @Date:2020/7/7 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  3. python数据挖掘学习】十五.Matplotlib调用imshow()函数绘制热图

    python数据挖掘学习]十五.Matplotlib调用imshow()函数绘制热图 #2018-03-28 14:47:19 March Wednesday the 13 week, the 087 ...

  4. 日语学习之——五十音图

    前言 学习外语最难的是如何开始-->从哪儿入手-->如何入门-->循序渐进:本文介绍个人在学习外语时的摸索:以新东方日语网络课程为基础+京东阅读(微信阅读)+翻译软件(百度翻译/有道 ...

  5. 日语学习之——五十音图及单词(3)

    五十音图 一:ま行(辅音M+元音)(M-第7行) 元音行 あ段 い段 う段 え段 お段 ま行 ま マ ma み ミ mi む ム mu め メ me も モ mo 相关单词 假名 日本汉字 中文意思 ...

  6. 日语学习之——五十音图及单词(2)

    五十音图 一:な行(辅音N+元音)(N-第5行) 元音行 あ段 い段 う段 え段 お段 な行 な ナ na に 二 ni ぬ ヌ nu ね ネ ne の ノ no 相关单词 假名 日本汉字 中文意思 ...

  7. 日语五十音图记忆口诀

    为了便于记忆五十音图,本人自己总结了一套记忆口诀,是在明王道老师的基础上总结的. 五十音图速记口诀: a: 阿(ア)分两半耳安(あ)在 i : 伊(イ) 人可以(い) 两分开 u: 眉宇捂(u)上露双 ...

  8. 听歌学日语2 五十音图 たなは行

    听歌学日语--基础入门篇2 欢迎来到沪江日语网 听歌学日语 大家好我是小安  关于一些上期节目一些沪友们的问题 小安在这里也简单的回答一下大家 策划: 小安 蛋蛋老师 编辑后期: 小安 朗读: 蛋蛋老 ...

  9. 哈哈日语 日语五十音图之ら、わ行

    这是五十音图第一阶段的最后两行假名啦,前段时间的五十音图假名,大家记得怎么样呢,都学会了吗,发音技巧都掌握了吗,相信大家一定学的很好了,接下来,让我们继续学习吧. 请点击此处输入图片描述 ​ら:发音方 ...

  10. 日语学习之——五十音图、浊音半浊音、拗音、长音促音

    一 本节内容 五十音图 浊音.半浊音 拗音 长音促音 二 五十音图对照表 あ段 い段 う段 え段 お段 あ行 あ ア a い イ i う ウ u え エ e お オ o か行 か カ ka き キ k ...

最新文章

  1. threejs加载obj模型_Vulkan编程指南(章节31-载入模型)
  2. C++ >>和<<读写文本文件
  3. lagrange插值(完成)
  4. 和硕看重物联网大势 程建中:从擅长领域出发
  5. MongoDB基础使用
  6. 看完此文章若你还不能完美的入门Python,我将永远退出IT界
  7. 作为一个职场中人的一些思考,关于做事的方式和思路
  8. “阿一web标准学堂”第1课:web标准概述(附视频、课件、代码下载)
  9. 数据结构与算法之美学习笔记:哈希算法-哈希算法在分布式系统中有哪些应用(第22讲)...
  10. Win7/Win8/IIS7/IIS8配置ASP/ACCESS
  11. 安装CentOS时提示an error has occurred - no valid devices were fo
  12. iOS马甲包开发招式及规避4.3方法合集
  13. 最短路径-弗洛伊德算法的java实现
  14. 如何将 M1 Mac(MacBook Pro、Air、iMac、Mac mini)恢复出厂设置?
  15. Chrome浏览器导出Excel,失败-网络错误
  16. 完美解决Word、Excel、PPT加密解密的方法
  17. 【weJudge】1109. [ACM]呐,你想成为什么颜色呢?
  18. WebDAV之葫芦儿•派盘+麻雀记
  19. ipv6地址数中/32,/48,/64含义
  20. html图片播放器,imgplay-基于canvas的图片序列播放jQuery插件

热门文章

  1. halt库卡_KUKA库卡机器人编程之字符串处理函数
  2. html 空格_HTML标签
  3. 福师大协和学院计算机老师,福建师范大学协和学院新进教师福利问题访谈
  4. c语言rand随机输出字母,菜鸟求助,写一个随机输出26个英文字母的程序
  5. pic单片机c语言存储器定义,PIC单片机C语言程序设计1 7.PDF
  6. java加密方式有哪些_面完平安JAVA,他们说了这些
  7. docker开启远程访问_Ubuntu安装Jupyter notebook——开启远程访问
  8. java获取eureka_获取Eureka服务列表的各种场景
  9. 人工智能的炒作_解密人工智能:是炒作还是我们期望太高
  10. linux 1080ti显卡黑屏,Ubuntu 17.04+GTX1080Ti 安装辛酸之路