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

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

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRVNKQWVBTmFlbjhlUFI2TGVsNHQyRTRDcGhicU9uaGpqOU9pYXhQMko3ZFdNOVJScmljQ0M5VmZGYlJZOGMwa2ljWDFpY2liTTVaOVJLcEtnLzY0MA.png


为什么qq里“可能认识的人”功能推荐的如此精准?

为什么两个没有什么联系的朋友会相互认识?  


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


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRVNKQWVBTmFlbjhlUFI2TGVsNHQyRWljaWNldGg0RTZFRUdlcGoxSkhKdUw3SllETjhJZjBCdWJaSWxtTVNSSVZXQkNaTWZRYm5SaEJ3LzY0MA.png


什么是图?


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


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRVNKQWVBTmFlbjhlUFI2TGVsNHQyRVBWbVhMbHJIYXFNb2t0eFBOd0tWZUdvdWU0cmVDZ2tFNlF4VDRRZU5qTVRHbHE0b0dqdDZUZy82NDA.png


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


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRUtJT3Z5Tktja1AxY2Y5a1dlMkIzeTFpYUw3bjFPcnFPSFVSUkdyUG1pYVVJOUhYYzRXeDF6STYzazhYRGxqelVaMU5WaWM3YXZHdGpJZy82NDA.png



aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRUtJT3Z5Tktja1AxY2Y5a1dlMkIzeTNMMll2VUpPMUhGaEhyNGNaRlBWMnI5Z0g4RHBIRVZjSmg1c2ppY3lPZWlieHZxUWtTbURQa3VnLzY0MA.png


来说说它的细节


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRVNKQWVBTmFlbjhlUFI2TGVsNHQyRW9YS1U2SWh3UDF3NFgweG9iRXlnQTZvcEpsRjJwTlVMbFJJTlYwTGxjUk1TaWNOMmNCczVRTXcvNjQw.png


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


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRVNKQWVBTmFlbjhlUFI2TGVsNHQyRU0wS24wbnJxRjRZck5pYUdiQjJLNUVtWWF1MENqdk1ObmtCamxvcjA0dWw1YWZDWGJqbHZHM0EvNjQw.png


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


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRVNKQWVBTmFlbjhlUFI2TGVsNHQyRXpLZDB0UVU5R29FSnJVdVlrTGE1TUtkeXFRcjNrbjlLN1BMWmFxVThHOFVveExDTGRud0pyQS82NDA.png


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


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



aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRUtJT3Z5Tktja1AxY2Y5a1dlMkIzeTFpYUw3bjFPcnFPSFVSUkdyUG1pYVVJOUhYYzRXeDF6STYzazhYRGxqelVaMU5WaWM3YXZHdGpJZy82NDA.png



如何存储图

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

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



aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRVNKQWVBTmFlbjhlUFI2TGVsNHQyRXhPanVZdkZZZ2N3Q2JDY0NYaWNqVm9SNGFVN2N4QmI0MXNSeWFoSzNlcUtNbFNlUTVJdUExVUEvNjQw.png



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

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

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


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRVNKQWVBTmFlbjhlUFI2TGVsNHQyRTc5Y0Q4b2hQWGRQejNpYjd6WXhFQmhuOEt2aWJQRHgzemgycHo1UEZpYnBGcXFmVElnNU1POGFxdy82NDA.png


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

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


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRUtJT3Z5Tktja1AxY2Y5a1dlMkIzeTlmb1RtVlZtTzJDZVIyS3lXZlpaQkpxZ1llYkNHdDgzRzVjaWF4OHZLYksxcHFKRDE2WGliNlRBLzY0MA.png



例如上图, 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 ,使得大量的二维数组数组空间被浪费。


使用邻接表(链表)存储


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRUtJT3Z5Tktja1AxY2Y5a1dlMkIzeVluT0xpYUxlR2ZlbFpUWkh5aDNXS3RtUW9YWFdEMklLaGdnVWFIVnpZOEp2SVpWb20zRnVLOFEvNjQw.png

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


aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9rdkJvYTd0NFBSRUtJT3Z5Tktja1AxY2Y5a1dlMkIzeU52Y2ZuVDhsdFZTMjdsTGJnZDRYem96aWIzYWZuaGhaV01YRGtpYU9JQ1ZtOXFxMEFJcUtpYkxpY2cvNjQw.png


两种存储方式的比较


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

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

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

相关文章
|
4月前
leetcode-2115:从给定原材料中找到所有可以做出的菜
leetcode-2115:从给定原材料中找到所有可以做出的菜
23 0
|
5月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 199. 二叉树的右视图 算法解析
☆打卡算法☆LeetCode 199. 二叉树的右视图 算法解析
|
6月前
|
算法
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
代码随想录算法训练营第十七天 | LeetCode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和
29 0
|
6月前
|
算法
代码随想录算法训练营第十九天 | LeetCode 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树
代码随想录算法训练营第十九天 | LeetCode 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树
43 0
|
6月前
|
存储 C++
【C++杂货铺】一颗具有搜索功能的二叉树(上)
【C++杂货铺】一颗具有搜索功能的二叉树
20 0
|
6月前
|
存储 C++
【C++杂货铺】一颗具有搜索功能的二叉树(下)
【C++杂货铺】一颗具有搜索功能的二叉树
22 0
|
12月前
|
存储 索引
搜索与图论-树与图的广度优先遍历
搜索与图论-树与图的广度优先遍历
|
存储 机器学习/深度学习 Java
《Java数据结构》这些树和二叉树的性质你还记得吗?
《Java数据结构》这些树和二叉树的性质你还记得吗?
|
前端开发
前端知识案例-树的广度优先遍历
前端知识案例-树的广度优先遍历
49 0
前端知识案例-树的广度优先遍历
|
存储 算法
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举
学会二叉树不知道干啥?二叉树的深度优先搜索和广度优先搜索,我要打十个乃至二十个(打开你的LeetCode撸起来)学练并举