再谈:被遗忘的艺术—图思维方式

每一个博古通今的人的脑子里面都装满了图,善于利用图去思考、去发散、去归纳总结、去融会贯通。
如果一张图不能解决问题,那就再加一张!
在这里插入图片描述

Ⅰ| 先解一道数学题

那么在现实生活中,绝大多数人具备图的思维方式吗?我们来一起看看下面这个问题:

构造一张图(由顶点、边构成的图),假设图里面有5个三角形,只增加1条边,就让三角形的个数倍增为10, 请画出这张图的结构来?

先决条件:这张图里面,顶点为账户,边为账户间的交易,账户间可以有多笔交易。所谓的三角形为三个账户间的转账交易形成的原子级的三角形(不可嵌套),三角形中每条边都是原子级的,仅对应一笔转账交易。

让我们来分析一下这个题目的关键点在哪里:只增加一条边,三角形却要增加5个。

也就是说,先前有5个 [公式] ,它们如共享了一条待增加的边后,就会形成新的5个三角形。而之前的5个三角形到底怎么样根本不重要!共享的新的边,意味着,这五个 [公式] 也会共享共同的两个顶点。分析到了这个地步的话,是不是答案已经呼之欲出了?

这是一道笔者从真实的业务场景中领悟与提炼出来的笔试面试题 。然而,对于擅长百度或者谷歌搜索以及刷题的应试者,这道题让很多人手无足措。90%的技术岗位的应试者在网上面试阶段看到这道题之后都归于沉默了。

剩下的9%的人会给出如下的图:很显然这个答案中的竖线实际上引入了多条边、多个顶点, 它并不符合只增加1条边的概念,而且也会破坏之前的(原子的、不可拆分的)三角形的定义。
在这里插入图片描述

大抵给出这种回复的人都没有仔细的读题 ,我们姑且把这个问题归结于这个浮躁的时代吧。

这个问题最好的地方在于,它可以有很多个答案,不一而足!例如下面这个答案,这样构图可谓用心良苦,虽然略显复杂,但在本质上完全符合上面的分析:固定两个顶点,连上一条边,出现了5个新的三角形。
在这里插入图片描述
那么更简洁的方案是什么样子的呢?下图所示的是7个顶点(A-G)之间已经形成了5个三角形,在AB之间如果再新增一条边,则7个顶点间就形成了10个三角形。为了在二维平面内表达这个高维空间,我们用虚线连表示被遮盖部分的边的样子。
在这里插入图片描述
很显然,这个方案用了较少的点和边。它最tricky的地方在于在顶点AB之间新增的边,很多人觉得“不可思议”,但是如果仔细读问题中的先决条件,AB如果是两个账户,账户之间可以存在多笔交易,这个其实已经在暗示读者解题的思路了。

那么,如果按照这个思路继续探寻下去,如何能构造一个使用最少的点和边的图就可以解决之前的题目呢?

下图中的方案是目前已知的仅使用4个顶点与7条边构造而成的五个三角形。增加了边8之后,形成了5个新的三角形。这个解法中最巧妙的地方是在顶点ACB之间由1-5号边所形成的4三角形复用了1234几条边。相当的巧妙对不对?
在这里插入图片描述
上面这个解决方案是一位00后的本科生给出的,“构图”相当的有技巧,没有一条多余的边,没有一个多余的顶点,笔者深以为然。

Ⅱ | 题目背后的意义?

现在让我们探究一下这个题目背后所蕴含的图的意义。在银行业中,以零售转账为例,大型的银行中有数以亿计的借记卡账户,这些账户每个月有数以亿计的交易(通常交易的数量会数倍大于账户数量),如果以卡账户为顶点,账户间的交易为边,就构造成了一张数以亿计的点边的大图。如何衡量这些账户之间的紧密连接程度呢?或者说如何去判断这张图的拓扑空间的结构呢?类似的,在一张SNS的用户社交网络图中,顶点为用户,边为用户间的关联关系,如何衡量这张社交图谱的拓扑结构或紧密度呢?

三角形是表达紧密关联关系的最基础的结构关系。如下面的社交网络图谱(局部)所示,两个红圈内的4个顶点间都构成了16个(222+222)三角形。从空间结构上看它们之间的紧密程度也更突出。
在这里插入图片描述
上面提到的大型银行中的转账账户间所形成的三角形关系的个数,在很大程度上可以表达银行的卡账户之间的某种关联关系的紧密程度。在某股份制银行的账户间2020年2-4月的三个月中转账数据中形成了2万亿个三角形,而顶点与边的个数都在10亿以内。也就是说平均每个顶点都参与到了上千个转账三角关系中!这个数字是非常惊人的,但是我们仔细分析的话会发现,当少量的顶点之间存在多条转账关系后,例如A、B、C三个顶点间,两两之间存在着100条边,那么它们总共就构成了100万个三角形关系。类似的,A与B两个顶点之间存在一条关系,它们各自分别与另外1000个账户存在转账关系,这时只要AB之间再增加一条边,图上就会增加1000个三角形,每增加一条AB之间的边就会增加至少1000个三角形。是不是有一点神奇?

在我们的语言传承中,三角形也被广泛的用来表达一种紧密的、对等的关联关系(但并非牢不可破的),古今中外莫不如此。例如,古罗马共和国时代的凯撒与庞培和克拉苏形成的长达7年的政治联盟—前三头同盟(First Triumvirate, 60-53BC),以及对应于10年后的罗马帝国初期的屋大维、马克·安东尼与雷必达所形成的后三头政治同盟(Second Triumvirate, 43-33BC)。三国演义中的故事让人难忘,大抵也是魏蜀吴三国之间的往来征战十分扣人心弦所致。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当然,无论是转账交易数据、社交网络数据亦或是电商交易数据或信用卡交易数据,数据所形成的网络(图),用数学的语言来定义就是一个拓扑空间(topological space),在这个拓扑空间中,我们关心的是数据之间的关联性、联通性、连续性、收敛性、相似度(哪些节点的行为、特征更为相似)、中心度、影响力,以及传播的力度(深度、广度)等等****。 用拓扑空间内数据关联的方法来构造的图可以100%的还原并反映真实世界中我们是如何记录并认知世界的。如果一个拓扑空间(一张图)不能满足对异构的数据的描述,就构造另一张图来表达。每一张图可以看做是从一个(或多个)维度或领域(例如知识领域、学科知识库等)对某个数据集的的聚类与关联,区别于传统关系型数据库的二维关系表的方式,每一张图可以是多张关系表的有机关联组合。在图的上面不再需要传统的关系表操作中的表连接(table join)操作,而取代以图上的路径或近邻类操作。我们知道表连接的最大问题是不可避免的会出现笛卡尔乘积(Cartesian Product)的挑战,尤其是在大表中,这种乘积的计算代价是极大的,参与表连接的表越多,他们的乘积越大(例如3张表X、Y、Z,他们的直积的计算量是{X}{Y}{Z},如果X、Y、Z各有100万、10万、1万行,计算量是天文数字的1000000000000000 = 1000万亿),在很多情况下,关系型数据库批处理缓慢的一个主要原因就是需要处理各种多表连接的问题。我们说这种低效性实际上是因为关系型数据库(以及它的配套的查询语言SQL)没有办法在数据结构层面做到100%反应真实世界造成的。人类大脑的存储与计算从来不会在遍历和穷举甚至通过笛卡尔乘积来计算上面浪费时间,但是当我们被迫使用关系型数据库以及Excel表格的时候,我们经常需要极为低效的做反复遍历和乘积的事情!在图上面则不会出现这种问题。无非在最坏的情况下,你可能需要以暴力的方式在图上面遍历一层又一层的邻居,但是它的复杂度依然远远低于笛卡尔乘积(例如1张图有1000万点边,遍历它的复杂度最大则为1000万。 任何高于其最大点边数量的计算复杂度都是数据结构设计败笔的体现)。

在上一篇文章中(链接下方),我们提到了一个关键的概念、一个愿景:图数据库是终极的数据库,所有的人工智能的终极归宿就是强人工智能,也就是具有人的智能。而我们可以确定的是,人的思维方式就是100%图的思维方式。通过原生图计算与分析,我们可以让机器具备人类一样的关联、发散、推导、迭代的能力

在这里插入图片描述
所谓原生图,是相对于非原生图而言的,在本质上指的是图数据是如何以更高效的方式存储的。非原生图采用的可能是关系型数据库、列数据库、文档数据库或者键值数据库来存储图数据;而原生图需要使用的存储方式在本质上是无近邻索引数据结构,或者称之为相邻哈希(Adjacency Hash)。相对于其他数据结构,相邻哈希的最大的优势是在图中访问任一数据它所需的时间复杂度为O(1),从任一数据点出发去访问它的1度近邻的时间复杂度也是O(1),反之亦然。而这种最低时间复杂度的数据访问恰恰就是人类在大脑中搜寻任何知识点时所采用的方式。这种数据结构显然和传统数据库中常见的基于树状索引的数据结构不同,从时间复杂度上看是O(1) vs. O(logN)的区别。而在更复杂的查询或算法实现中,这种区别会放大为O(K) vs. O (N * log N)或者更大的差异性 (K>=1, 通常小于10或者20,但一定远远小于N,假设N是 图中顶点或实体的数量)。 这就意味着在复杂运算的时效性上会出现指数级的区别,图上面如果是1秒钟完成,传统数据库则可能需要1个小时、1天或者更久(或者无法完成)来完成。
在这里插入图片描述

当然,数据结构只是解决问题的一个方面,我们还需要从体系架构(例如并发、高密度计算)、算法并发优化、代码工程优化等多个维度去让(原生图)图数据库真的腾飞。有了原生图存储与高并发、高密度计算在底层算力上的支撑,图上的遍历、查询、计算与分析可以得到进一步的飞跃!如果传统的图数据库号称比关系型数据库快1000倍,那么飞跃之后的图要快100万倍!

欢迎来到图的世界!

文/ 孙宇熙
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值