前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么QQ能帮你找到失散多年的兄弟?----图论

为什么QQ能帮你找到失散多年的兄弟?----图论

作者头像
机智的程序员小熊
发布2019-12-11 18:09:34
3960
发布2019-12-11 18:09:34
举报
文章被收录于专栏:技术面面观

编程三分钟的第 44 篇原创文章

为什么qq里“可能认识的人”功能推荐的如此精准? 为什么两个没有什么联系的朋友会相互认识?

一切的背后到底是道德的沦丧,还是人性的扭曲 ? 让我们走进图的内心世界!

什么是图?

微信好友之间的关系像一张巨大的网络,朋友的朋友可能是自己的朋友,所以用一种叫 的数据结构储存起来,元素和元素之间都可能发生关系

下面要开始干货了!非战斗成员请撤离,图有两种有向图和无向图,唯一的区别就是有木有箭头,是不是看起来很像关系网。

来说说它的细节

图上的东西全都有名字,圆圈 圈着字母叫 顶点,是最基本的组成元素。

连接各个顶点的线就是 可以没有 边,但是不能没有 顶点 。连接某个顶点的边数量叫做这个顶点的 度。比如上图中的 C 有三个度。

有向图多一个概念,那就是出度,入度。比如 C 顶点,有两个箭头指向自己,一个箭头指出来,就是两 入度,一 出度。

结合上面的几个概念,来做点题目,如图:

如何存储图

经过我精彩的表达,想必你肯定知道了图的基本概念,作为一个技术人员,刨根问底才是我们的特色。

有没有想过长的这么疯狂的一个数据结构,他是怎么的?

因为要表现出来每个顶点都有可能指向其他顶点,所以有两种常见的储存方式,二维数组 和 邻接表。

使用邻接矩阵(二维数组)存储

下面就是非常明显的二维数组存储图的例子。

上图是 8 * 8 的二维数组,竖着和横着都是各个 顶点,比如 开发 、设计 、工程 都是顶点。

每一行都代表当前这个人对其他 8 个人的看法(包括自己),在图里就只有 有关系没关系 两种看法而已。

例如上图, A - G 共 7 个顶点,所以需要 7 * 7 的二维数组。

横坐标代表着当前的节点,纵坐标代表当前节点和其他节点的关系,加入当前节点有 出度,那么当前的值就为 1 ,入度不管,拆解如下:

-

A

B

C

D

E

F

G

A

0

1

0

0

0

0

0

B

0

0

1

0

1

1

0

C

0

0

0

0

1

0

0

D

0

0

1

0

0

0

0

E

0

1

0

1

0

0

0

F

0

0

0

0

0

0

1

G

0

0

0

0

0

0

0

头发少叫头发稀疏,1 少就叫 稀疏矩阵,指的就是图的各个顶点之间的联系很少,存了没意义的 0 ,使得大量的二维数组数组空间被浪费。

使用邻接表(链表)存储

如上面的 ,对其使用 链表 来存储,略像哈希表,每行都是一个节点,每列也只存储这个节点的所有 出度。

两种存储方式的比较

我们要根据不同的情况来决定不同的存储数据结构:

(1)数组:浪费空间,但是速度快。适合处理数据不大的,只要数据不大,优先选用数组

(2)链表:节省空间,但是速度慢。数据大的时候,使用邻接表(链表来存储)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机智的程序员小熊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用邻接矩阵(二维数组)存储
  • 使用邻接表(链表)存储
  • 两种存储方式的比较
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档