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

编程三分钟的第 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. 链表:节省空间,但是速度慢。数据大的时候,使用邻接表(链表来存储)

推荐阅读:

我偷偷挖了一条网络隧道,差点被公司激活

每天三分钟玩转Git(完结)

promethus与监控系统


点此了解并加入编程大队,编程大队,nb !!

原文地址:https://www.cnblogs.com/pzqu/p/12022938.html

时间: 2024-11-08 13:38:18

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

Python不能帮你找到女朋友,却能让你成为有钱的单身狗

王者荣耀的团队年终奖是100个月工资.华为的员工房租补贴就有8000块.BAT校招起步价年薪20万--如果你看到这些消息的第一反应就是"炒作",那只能说,贫穷限制了你的想象力. 一.选对行业,少奋斗十年 最近一则视频火了,中国科技大学的几名人工智能专业的学生接受了采访,这些毕业生个个手拿五六个offer,当谈起薪资时,他们表示年薪三四十万只是起步价,更有人一毕业就达到了两百万的年薪. 采访视频的部分截图 互联网行业,尤其是开发者的工资远高于其他传统行业,这已经是人尽皆知的老生常谈了,在

一个小工具,帮你找到赚钱思路

有时候你知道什么方向赚钱,那么你要入场,该找哪个切入点呢?之前我都是瞎找,从朋友圈或者是公众号大家的推文,找到机会. 前段时间从别处知道了这个工具,我试着搜索了两个词语:副业 和 赚钱 ,得到了这样的一些数据. https://mmbiz.qpic.cn/mmbiz_png/FAlIsKMhcyw9f0aD3xd4AibxuUZond6JpR8kYZsccV6DcOdAML3TSsuwB4aO8Npsmc2PMibH7kXIKDG4JibaEJuCQ/640?wx_fmt=png&tp=webp

【PTA-天梯赛训练】愿天下有情人都是失散多年的兄妹

呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚? 输入格式: 输入第一行给出一个正整数N(2 ≤ N ≤),随后N行,每行按以下格式给出一个人的信息: 本人ID 性别 父亲ID 母亲ID 其中ID是5位数字,每人不同:性别M代表男性.F代表女性.如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1. 接下来给出一个正整数K,随后K行,每行给出一对有情人的I

你身边的女神吸烟吗?——卡方分析帮你找到答案

隔壁班的女神长得漂亮,人见人爱,但你总在她身上闻到一阵烟味--女神吸烟的可能性有多高? 众所周知,我们身边的一些男同胞们常常会吸烟减压,而女生则相对少见.那么吸烟的女生数量真的比男生少吗?性别跟吸烟是否存在相关性? 本着学术的严谨,小编决定搜集一波数据,来一次严谨的分析. 搜集男性和女性的吸烟数据后,计算数据的p值,发现其呈现出显著性,说明两组数据具有显著性差异,可以进行卡方分析进一步探究. 卡方分析 卡方分析(又称为交叉表分析,列联表分析,Pearson卡方分析等),常被用于分析两组分类数据之

愿天下有情人都是失散多年的兄妹

呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚? 输入格式: 输入第一行给出一个正整数N(2 ≤ N ≤),随后N行,每行按以下格式给出一个人的信息: 本人ID 性别 父亲ID 母亲ID 其中ID是5位数字,每人不同:性别M代表男性.F代表女性.如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1. 接下来给出一个正整数K,随后K行,每行给出一对有情人的I

从红包爆发季到来前 看为何难有百年社交?

再过几天,2016年春节就将来到.在这最受重视的传统节日里,或许我们听到最多的祝福语将不再是"春节快乐"."除夕快乐"等,而是"祝你抢个大红包"!虽然听起来能萌出一脸血,但仔细想想原本富有深刻韵味的拜年话成了具有调侃味儿.铜臭味的话语,总感觉怪怪的. 在这每年相聚和分离最频繁的时候,也是大众沟通更为频繁的时间.相比以往,更是红包摇一摇集中爆发之际.在去年,微信红包就被挤爆.而在今年,支付宝更是率先以2.69亿元夺下猴年春晚的合作资格,并推出&qu

辛巴学院-阅微堂-剑英陪你零基础学c#系列(一)Hello World

辛巴学院:一个不花钱的攻城狮地下网络学院.辛巴学院:愿天下所有的攻城狮,都找到失散多年的荣耀石. 剑英陪你系列又来啦.剑英是一个有大爱的人,热爱每一个程序员,尤其是年轻漂亮的女程序.最近组织朋友们玩了一次即兴团体诗创作,无论怎么开头,都会走上厕所文化的道路.尤其是卫生纸的出镜率极高.这让我对这个群体的心理健康有了深深的担忧,任重而道远啊.让我们一起响应暴走九月不撸,不撸不撸,九月我不撸. 你可能已经看过了无数的Helloworld,是什么感觉呢?兴奋,失望,满足?还是已经想不起来什么感觉了?我已

人在囧途——Java程序猿学习Python

引言 LZ之前其实一直对python都很好奇,只是苦于平时没有时间去了解它,因此趁着51假期这个机会,便迫不及待的开始了自己的探索.作为一个标准的Java程序猿,在了解python的过程当中,LZ遇到了很多囧事,接下来LZ就一一给大家说道说道.本文纯属看个乐子,非python教学. 囧事一:eclipse插件安装篇 由于LZ习惯了使用eclipse进行开发,因此对python的研究,还是希望可以在eclipse上进行试验.那么第一件事,自然是安装python的eclipse插件,于是百度.goo

LinqToDB 源码分析——前言

记得笔者进入公司的时候接触的第一个ORM框架是Entity Framework.为了Entity Framework也看了不些的英文资料(不是笔者装B哦).正式使用三个月后.笔者对他有一个全面性的认识.我只能说他真的很强大,也很方便.可是我并不是很喜欢他.要问为什么的话,笔者只能说喜欢就是喜欢.不喜欢就是不喜欢.不需要过多的理由.笔者就是这样子的一个人.但是笔者不会忽略他的强大的一面.微软的目标还是老样子--开发简单化.只是在Entity Framework的数据迁移上面笔者不是很喜欢.至少在笔