生活中的图
地图中的图
我们在用百度地图的时候,常常会使用导航功能。比如你在地铁站A附近,你想去的地点在地铁站F附近,那么导航就会告诉你一个最佳的地铁线路换乘方案。
这许许多多地铁站所组成的交通网络,也可以认为是数据结构中的图。
社交网络中的图
举个例子,比如微信。假设你的微信朋友圈中有若干好友:张三、李四、王五、赵六、七大姑、八大姨。
而你七大姑的微信号里,又有若干好友:你、八大姨、Jack、Rose。
微信中,这许许多多的用户就组成了一个多对多的朋友关系网,这个关系网就是数据结构中的图(grahp)。
数据结构提供了 3 种存储结构,分别称为线性表、树和图
- 线性表是最简单的存储结构,它是一对一的关系
- 树的节点之间是一对多的关系,并且存在父与子的层级划分;
- 而图的顶点之间是多对多的关系,并且所有的节点是平等的,无所谓谁是父谁是子。
树和图有很多相似之处,它们的区别是:树存储结构中不允许存在环路,而图存储结构中可以存在环路
图
定义
图(graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G ( V , E ) G(V, E) G(V,E),其中,G表示一个图,V是图G中顶点(vertex)的集合,E是图G中边(Edge)的集合。
对于图的定义,我们需要明确几个注意的地方:
- 线性表中我们把数据元素叫元素,树中叫结点,在图中数据元素我们则称之为顶点(Vertex)。
- 线性表可以没有数据元素,称为空表,树中可以没有结点,叫做空树,但是,在图中不允许没有顶点,但是可以没有边
- 关系:
- 线性表中,相邻的数据元素之间具有线性关系
- 树结构中,相邻两层的结点具有层次关系
- 而图结构中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。
如下中,共有 V0,V1,V2,V3 这 4 个顶点,4 个顶点之间共有 5 条边。
顶点 && 边
在图中,最基本的单元是顶点(vertex),相当于树中的节点。图中的一个顶点可以和任意其他顶点建立连接关系,我们把这种建立的关系叫做边(edge)。
无向边 VS 有向边
- 无向边:
- 顶点Vi与Vj之间的边没有方向,则称这条边为无向边(Edge),用无序偶 (Vi,Vj) 来表示。
- (Vi,Vj) 与 (Vj,Vi) 意义相同,表示x和y之间有连接。
- 有向边:
- 若从顶点Vi与Vj之间的边有方向,则称这条边为有向边,也成为弧(Arc),用有序偶
<Vi,Vj>
来表示,Vi为弧尾,Vj为弧头。 <Vi,Vj>
与<Vj,Vi>
表示的意义是不同的,<Vi,Vj>
表示从Vi连接到Vj,Vi称为尾,Vj称为头;<Vj,Vi>
表示从Vj连接到Vi,Vj称为尾,Vi称为头
- 若从顶点Vi与Vj之间的边有方向,则称这条边为有向边,也成为弧(Arc),用有序偶
并且,图中习惯用 VR 表示图中所有顶点之间关系的集合。
下图无向图的集合 VR={(v1,v2),(v1,v4),(v1,v3),(v3,v4)}
下图有向图的集合 VR={<v1,v2>,<v1,v3>,<v3,v4>,<v4,v1>}
。
度、入度、出度
这是针对有向图的。
- 顶点 V 的度是和 V 相关联的边的数目,记为TD(V)
- 以顶点V为头的边的数目叫做入度(箭头指向 V的弧的数量),记为ID(V)
- 以顶点V为尾的边的数目叫做出度(箭头远离 V的弧的数量),记为 OD(V)
- 顶点的度 = 入度 + 出度。即 TD(V) = ID(V) + OD(V)。
下图中,
V
0
V_0
V0 顶点的度为 3 ,入度为1,出度为2
以微信为例,我们可以把每个用户看作一个顶点。如果两个用户之间互加好友,那就在两者之间建立一条边。所以,整个微信的好友关系就可以用一张图来表示。其中,每个用户有多少好友,对应到图中,就叫做顶点的度(degree),就是跟顶点相连接的边的条数。
邻接
- 邻接是两个顶点之间的一种关系。如果图包含(u,v),则称顶点 v 与顶点 u 邻接。在无向图中,这也暗示了顶点 u 也与顶点 v 邻接。换句话说,在无向图中邻接关系是对称的。
各种图
简单图
在图结构中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。
无向图 VS 有向图
- 无向图定义:若图中任意两个顶点之间的边均是无向边,则称该图为无向图
- 有向图定义:若图中任意两个顶点之间的边均是有向边,则称该图为有向图
应用:
- 有向图中顶点之间的关联并不是完全对称的。还拿微信来举例,你的好友列表里有我,但我的好友列表里未必有你。这样一来,顶点之间的边就有了方向的区分,这种带有方向的图被称为有向图。
- 相应的,在QQ当中,只要我把你从好友里删除,你在自己的好友列表里也就看不到我了。因此,QQ的好友关系可以认为是一个没有方向区分的图,这种图被称为无向图。
完全图、无向完全图、有向完全图
-
完全图:若图中各个顶点都与除自身外的其他顶点有关系,这样的无向图称为完全图
-
无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图(含有n个顶点的无向完全图有(n×(n-1))/2条边
-
有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的两条边,则称该图为有向完全图。(含有 n 个顶点的有向完全图有 n×(n-1) 条边)
稀疏图 VS 稠密图
这里的稀疏和稠密是模糊的概念,都是相对而言的,通常认为边或弧数小于n*logn(n是顶点的个数)的图称为稀疏图,反之称为稠密图。
带权图
有些图的边或弧带有与它相关的数字,这种与图的边或弧相关的数叫做权(Weight),带权的图通常称为网(Network)。
假设有两个图G1=(V1,E1)和G2=(V2,E2),如果V2⊆V1,E2⊆E1,则称G2为G1的子图(Subgraph)。
连通图 VS 非连通图
在无向图G中,如果从顶点v到订单v’有路径,则称v和v’是连通的。如果对于图中任意两个顶点
v
i
、
v
j
∈
E
vi、vj ∈E
vi、vj∈E, vi,和vj都是连通的,则称 G 是连通图,否则图为非连通图。
下图中A、B、C、D是连通的,但是其中任一顶点与顶点E或者顶点F之间没有路径,因此是非联通图
若添加顶点B与顶点F之间的邻接边,则图变为连通图
路径&&回路
- 路径:在图中,依次遍历顶点序列之间的边所形成的轨迹。
例如:下图中依次访问顶点 V0 、V3 和 V2 ,则构成一条路径。
如果路径中第一个顶点和最后一个顶点相同,则此路径称为"回路路"(或"环")。
如下图,从 V1 存在一条路径还可以回到 V1,此路径为 {V1,V3,V4,V1},这是一个回路(环),而且还是一个简单回路(简单环)