seegongsik
数据

什么是图数据结构

假设把朋友关系写进表里。一行行写下谁和谁是朋友,那么每次找朋友的朋友,都得把表翻上好几遍。可要是把人画成点,把朋友关系画成线呢?从一个点顺着线走,就能看到朋友;再顺着朋友的线走,朋友的朋友马上就出来了。像这样用点和线装关系的数据结构,就是图。

01

用点和线装关系

到目前为止,我们看了把值装进一排、表和树的方法。可有些数据,值和值之间的关系比每个值本身更重要,比如谁和谁是朋友,哪个站和哪个站相连。
这时候排成一排就很别扭。所以把人画成点,把朋友关系画成线。点也叫节点,线也叫边,只靠点和线,关系就原原本本地装进去了。

ABCDE
● 点 = 人— 线 = 朋友关系
依次点两个人,用线连起来

依次点两个人,用线连起来。点是人,线是朋友关系。

点一连起来,关系就看得见了。谁和谁连着,看线就马上知道,比在表里一行行写要形象得多。
点是对象,线是关系,用这两样装起来的数据叫作图。像朋友这样互相的关系,用没有方向的线来画;像一个人关注另一个人这样单向的关系,用带箭头的线来画。那么,顺着这些线走,能知道什么呢?

02

顺着线到朋友的朋友

从一个人开始。顺着连在这个点上的线走,就到了这个人的朋友。不停下来,再顺着连在朋友那些点上的线走,就到了朋友的朋友。
像这样每次再往远走一步,就能碰到熟人的熟人。社交软件推荐“你可能认识的人”,用的也是这个办法。

我P1P2P3P4P5P6
● 我● 朋友● 朋友的朋友
点起点(我),先亮起朋友

点一个人,朋友就亮起来;再点一次,朋友的朋友接着亮起来。

点一次亮起朋友,再点一次亮起朋友的朋友。离开始的人有多远,取决于走过了几条线。
走一条线是朋友,走两条线是朋友的朋友。要是用表,为了弄清这一点,得翻来覆去地查好几遍。顺着线走,就这么简单。

03

顺着邻居把整群逛一遍

和一个点用线直接相连的点,叫作这个点的邻居。从一个点走到邻居,再走到邻居的邻居,顺着线一直铺开去。
走着走着,就会没有地方可去了。到那时走到的点,就是彼此相连的一群。没有用线连着的点,不在这群里面。从最近的邻居开始一层层往外扩,这种方法叫作广度优先搜索。

N1N2N3N4N5X1
点亮起的点的邻居,一段段铺开

点一下亮起的那群边缘上的邻居,一步步往外铺开。只有连着的点会亮。

顺着邻居铺开,连着的点一个接一个亮了起来。线能到的地方都逛到了。相反,离得远的点,不管怎么走都不亮。
有没有用线连着,决定了分成哪一群。在图里顺着邻居走,只要看线就行,很简单。那么,同样的事用表来做会怎样?

04

用表还是用图

假设朋友关系写在表里。要找朋友的朋友,得先在表里找出自己的朋友记下来,再为每个朋友把表重新翻一遍。每多走一步,就得把表再扫一遍。
用图的话,从点顺着线走,再从那些点顺着线走,就完事了。关系是核心的时候,图要方便得多。

把“我的朋友的朋友”全找出来
用表解
0 次点击
用图解
0 次点击

用表和图分别解同一个“朋友的朋友”问题。比比各要点几次。

用表找同样的答案,点的次数多得多,因为查询得一遍遍重复。用图,顺着线走两次就完了。
当然,表并不差。要一行行记录、汇总起来,表很合适。只是碰上顺着关系走的活儿,用点和线装起来的图要自然得多,也快得多。地图应用找路时,用的也是图:把站和路当成点和线,每条线上写着距离。

05

小结

用一句话概括:把对象当点、把关系当线装起来,就是图。从一个点顺着线走,会出来邻居;再顺着邻居走,会出来朋友的朋友。
顺着线铺开,就能看到连成一片的一群。在以关系为核心的事上,不用一遍遍翻表,只要顺着线走就行。点=对象、线=关系,再加上顺着邻居走,这就是图。

依次点要点回顾一下

依次点要点回顾一下。(点是对象、线是关系 → 朋友的朋友 → 顺着邻居走 → 关系就用图)

现在你知道怎样用点和线装关系、再顺着线四处走了。在表里很别扭的朋友的朋友,在图里两条线就到了。数据摆成什么形状,同一件事就可能变得容易,也可能变得难。
不过,想向数据库问点什么,就得用规定好的语言来问。下一课学向数据库提问的语言:SQL。

一句话总结图是把对象当成点、把对象之间的关系当成线来装的数据结构。把人当点、把朋友关系当线,连接就一目了然。从一个点顺着线走,会出来邻居;再顺着邻居的线走,会出来朋友的朋友。像这样顺着线铺开,就能把相连的一整群逛一遍。在推荐、找路这类以关系为核心的事上,用表要翻好几遍的,用图只要顺着线走就行。总之,点=对象、线=关系,再加上顺着邻居走,这就是图。
← 数据
如果有帮助,请支持我们