为什么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 ,使得大量的二维数组数组空间被浪费。
使用邻接表(链表)存储
如上面的 图,对其使用 链表 来存储,略像哈希表,每行都是一个节点,每列也只存储这个节点的所有 出度。
两种存储方式的比较
我们要根据不同的情况来决定不同的存储数据结构:
- 数组:浪费空间,但是速度快。适合处理数据不大的,只要数据不大,优先选用数组
- 链表:节省空间,但是速度慢。数据大的时候,使用邻接表(链表来存储)
推荐阅读:
点此了解并加入编程大队,编程大队,nb !!
为什么QQ能帮你找到失散多年的兄弟?----图论的更多相关文章
- 愿天下有情人都是失散多年的兄妹(bfs)
L2-016. 愿天下有情人都是失散多年的兄妹 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 呵呵.大家都知道五服以内不得通婚 ...
- L2-016. 愿天下有情人都是失散多年的兄妹(深搜)*
L2-016. 愿天下有情人都是失散多年的兄妹 参考博客 #include<iostream> #include<cstdio> #include<cstring> ...
- L2-016 愿天下有情人都是失散多年的兄妹
L2-016 愿天下有情人都是失散多年的兄妹 (25 分) 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你 ...
- Spring Cloud失散多年的哥哥Dubbo学习笔记
Spring Cloud失散多年的哥哥Dubbo 随着互联网项目用户量的急剧增长,访问并发良突然暴增,将一个应用使用多个独立的工程共同实现的系统架构,称为SOA系统架构,各个工程可以允许在不同的机器上 ...
- PAT L2-016. 愿天下有情人都是失散多年的兄妹 (BFS)
L2-016. 愿天下有情人都是失散多年的兄妹 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 呵呵.大家都知道五服以内不得通婚 ...
- 大一那会,我用QQ远程帮同学考过计算机二级
考证 大一那会儿流行考证,什么普通话.教师资格证.计算机.商务英语各种证五花八门的. 我们非计算机专业(我是通信工程)的基本上都会去考一个叫计算机二级的证书,说是找工作有用,大一新生,哪懂这些,一窝蜂 ...
- 功能强大的Xcode辅助工具Faux Pas:帮你找到各种隐形的bug
本文转载至 http://www.cocoachina.com/industry/20140804/9307.html Faux Pas(Beta版下载地址)是一个Xcode辅助工具,用以检查Xcod ...
- Appium+python自动化(十九)- 猴哥失散多年的混血弟弟还是妹妹- Monkey(猴子)参数(超详解)
简介 前边几篇介绍了Monkey以及Monkey的事件,今天就给小伙伴们介绍和分享一下Monkey的参数. 首先我们看一下这幅图来大致了解一下: 1.Monkey 命令 基本参数介绍 -p <允 ...
- Appium+python自动化(二十)- 猴哥失散多年的混血弟弟还是妹妹- Monkey(猴子)日志(超详解)
简介 日志是非常重要的,用于记录系统.软件操作事件的记录文件或文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统.软件的活动等重要作用,在开发或者测试软系统过程中出现了问 ...
随机推荐
- AndroidOS体系结构
首先上图一张 对照着图,我们再来看Android 系统的体系结构就爽多了.我们从底层向上进行分析. 一.Linux 内核层 Linux Kernel 基于linux2.6.其核心系统服务如安全性.内存 ...
- Docker常见报错解决方法记录
[问题一]OCI runtime exec failed......executable file not found in $PATH": unknown [root@localhost ...
- 8.3 NOIP 模拟12题解
话说这次考试T1和T2是真的水,然而T1CE,T2TLE,T3CE 这不就是在侮辱我的智商啊!之前本机编译都是c++,以后要用c++11. 这次的T1就是一个大型找规律,我的规律都找出来了,但是竟然用 ...
- 『题解』Codeforces9D How many trees?
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description In one very old text file there was wr ...
- 最新JetBrains PyCharm 使用教程--安装教程(一)
安装过程 Pycharm 激活码 license server选项里边输入:http://intellij.mandroid.cn/
- 详解Spring Security的HttpBasic登录验证模式
一.HttpBasic模式的应用场景 HttpBasic登录验证模式是Spring Security实现登录验证最简单的一种方式,也可以说是最简陋的一种方式.它的目的并不是保障登录验证的绝对安全,而是 ...
- 通过canvas合成图片
通过canvas合成图片 效果图 页面布局部分 两个图片以及一个canvas画布 <img src="https://qnlite.gtimg.com/qqnewslite/20190 ...
- 【SpringBoot | Redis】SpringBoot整合Redis
SpringBoot整合Redis 1. pom.xml中引入Redis相关包 请注意,这里我们排除了lettuce驱动,采用了jedis驱动 <!-- redis的依赖 --> < ...
- 领扣(LeetCode)最大连续1的个数 个人题解
给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组 ...
- Json模块和Pickle模块的使用
在对数据进行序列化和反序列化是常见的数据操作,Python提供了两个模块方便开发者实现数据的序列化操作,即 json 模块和 pickle 模块.这两个模块主要区别如下: json 是一个文本序列化格 ...