前言(转载请说明作者:极客BOY)
图
在前面的线性结构和树形结构,我们可以总结出:
线性结构:一对一;树形结构:一对多
但是现实情况可能复杂的多,关系可能错综复杂。
图在电子线路分析、人工智能、信息检索等方面都有广泛应用,也已经渗透到语言学、逻辑学、管理学、电子、化学、通信等各种研究领域中。
定义
多对多:每个元素都可以跟其他任何元素存在关系。
图中的数据元素通常称为顶点,所有顶点构成顶点集,我们通常用V(Vetex)来表示。
元素间的关系用边来表示通常用E(edge)来表示边集合。
e.g.1
G1={v,E}
V={v1,v2,v3,v4,v5}
E={(v1, v2),(v1, v4), (v2, v3),(v2, v5), (v3, v4), (v3, v5)}
PS:没有方向的边,用小括号来表示
e.g.2
G2={V,E}
V={v1, v2, v3, v4}
E={<v1, v2>,<v1, v3>,<v3, v4>,<v4, v1>}
PS:有方向的边用尖括号来表示,有向边又称为弧
根据图中的边是否有方向,图可分为:无向图、有向图。
有时,图中的边可能带有权值,这种带权图称为:网
在数学领域,权值指加权平均数中的每个数的频数,也称为权数或权重。
e.g.3
具有4个结点、6条边,任两个顶点间都有一条边。
完全图:有n个顶点,n(n-1)/2条边的无向图。
有向完全图:有n个顶点,n(n-1)条边的有向图。
PS:完全图中的边数达到该图的最大值。
图的基本概念
我们通常用**“邻接”来描述两个顶点间的关系**
邻接点:若图中两个顶点之间存在边或弧,则称两个顶点互为邻接点。
例如在G1
中,v2
和v3
互为邻接点,因为存在边(v2,v3)
。
称:(v2,v3)
依附于顶点v2和v3。
度:一个顶点的邻接点的个数。
有向图中,顶点的度分为:
- 入度:指以该顶点为弧头的弧的数目。
- 出度:指以该顶点为弧尾的弧的数目。
v1
的度是3,其中入度为1 (<v4,v1>
) 出度为2 (<v1,v2> <v1,v3>
)
路径
无向图G
中,从顶点vi
到顶点vj的路径是一个顶点序列,起点为vi,终点为vj ,可表示为一个这样的序列:
(vi,vi0,vi1, ....vi.n. vj)
,其中任意两个相邻的顶点间必须存在邻接关系。
如果图G是有向图,则路径也是有向的。
路径长度:路径上边或者弧的条数。
环/回路:如在G1
中:{v2,v3,v5,v2}
是一条回路,G2
中{v1,v3,v4,v1}
也是一条回路。
图的存储
图是一个复杂的数据结构,任意两个元素间都可以存在联系。
在我们之前学过的线性结构和树形结构中,都可以使用顺序和链式存储来存储,在图中是不是也可以呢?
顺序存储:邻接矩阵
邻接矩阵即表示邻接关系的矩阵。
邻接关系:图中两个顶点间的直接联系,即图中的边或弧。
如何存储每条边?