为什么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 !!
相关文章
- HarmonyOS SDK对应的API版本跃迁引发的历史工程适配问题解决方案
- Parrot OS安全版:面向安全管理员的Linux桌面发行版
- 超越批量处理与MapReduce:如何让Hadoop走得更远
- 大数据分析专题:利用向外扩展技术深入挖掘商业价值
- HipHop算法:利用微博互动关系挖掘社交圈
- AMD皓龙A系列平台实现首次基于ARM的Hadoop演示
- Windows 10系统电脑,提示runtime error错误是什么意思,该怎么修复?
- 两台不一样的电脑,如何在Windows 10系统中共享打印机?看看如何操作
- Edge用户反馈:全屏看YouTube浏览器会卡死/崩溃
- Linux奇技淫巧:如何从浏览器监视Linux服务器资源
- Windows 10启用新图标集:Windows 95时代的痕迹被清理干净了
- 微软 Edge 浏览器 iOS 版 91 Beta 下载发布:具有统一代码库,更快更流畅
- Windows 10内置杀软竟然有大Bug!微软官方修复出炉
- 使用Windows 10系统,发现系统任务栏挡住了窗口底部,如何才能处理呢
- 图数据挖掘及典型实现浅析
- 浏览器市场份额最新统计:谷歌 Chrome 持续增长,其余全部下滑
- Windows 10将于今年7月移除Flash插件 耗电量太离谱
- 从Linux5.9看Icmp的处理流程
- Rocky Linux 8.3首个候选版发布,真正免费开源的CentOS替代方案
- 一个数据挖掘大牛,用程序算法做人生选择