在计算机程序设计中,图结构也是一种非常常见的数据结构。
研究图结构的主要目的就是为了研究事物之间的关系(顶点代表事物,边代表两个事物之间的关系)。
图的现实案例:
程序就是现实的一种模拟、一种抽象。
图可以用来模拟很多现实的数据结构。比如:
- 人与人之间的关系网:每个人都是一个顶点,人与人之间的关系就形成一条边。
- 地铁图:每个站点都是一个顶点,站点与站点之间的线路就形成一条边。
图的简介:
图由顶点和边构成。通常用 V(Vertex)表示顶点,用 E(Edge)表示边。
顶点:
顶点就是图中的一个节点。比如:0 是一个顶点,1 是一个顶点。
由一条边连接在一起的顶点称为相邻顶点。比如:0 - 1 就是相邻顶点,0 - 2 不是相邻顶点。
度:
一个顶点的度就是其相邻顶点的数量。比如:顶点 0 有两个相邻顶点,那么顶点 0 的度就是 2。
边:
边是顶点和顶点之间的连线。比如:0 - 1 有一条边,0 - 2 没有边。
边可以是有向的,也可使是无向的。比如:A - B 表示无向,A 可以到 B,B 也可以到 A;A -> B 表示有向,A 可以到 B,但 B 不可以到 A。
路径:
路径是顶点 v1、v2…vn 的一个连续序列。比如:0 - 1 - 5 - 9 就是一条路径。
如果一条路径中不包含重复的顶点,那么它就是简单路径。比如:0 - 1 - 5 - 9 就是一条简单路径,0 - 1 - 5 - 2 - 4 - 5 - 9 就不是一条简单路径。
如果一条路径的第一个顶点和最后一个顶点相同,那么它就是回路。比如:0 - 1 - 5 - 6 - 3 - 0。
有向图和无向图:
如果图中所有的边都没有方向,那么这个图就是无向图。
如果图中的边是有方向的,那么这个图就是有向图。
无权图和带权图:
权:权重,是希望表示的任何数据。
如果图中的边没有携带权重,那么这个图就是无权图。比如:不能说 4 - 9 的边比 0 - 1 的边更远或者所需要花费的时间更长。
如果图中的边有一定的权重,那么这个图就是带权图。
图的表示:
有两种常见的表示图的方法:邻接矩阵和邻接表。
邻接矩阵:
矩阵在程序中就是一个数组。
可以用一个二维数组来表示邻接矩阵。让每个顶点和一个整数相关联,该整数作为数组的下标值。通过 二维数组[][]
的值来表示边。比如:上图中,0 就是 A 在数组中的下标 ,2 就是 C 在数组中的下标,通过 二维数组[0]2]
就得到了值 1 ,表示 A - C 之间是有边的,通过 二维数组[2][0]
就得到了值 1 ,表示 C - A 之间是也有边的。
邻接矩阵的优点:可以很好的表示有向图、无向图和有权图和带权图(只需要改变二维数组中的值即可)。
邻接矩阵的缺点:如果顶点与顶点之间的边很少(稀疏图),那么邻接矩阵中将会存在大量的 0 ,这意味着浪费了计算机的存储空间来表示根本不存在的边。
邻接表:
邻接表由图中每个顶点以及和顶点相邻的顶点列表组成。比如:第一行表示顶点 A 和与它相邻的顶点 B、C、D。
邻接表的优点:邻接表的表示方式和存取方式都比较简单。
邻接表的缺点:邻接表计算出度是比较简单的;但是如果邻接表是有向的,那么计算入度则非常麻烦(必须构造一个逆邻接表,才能有效地计算入度)。
出度:指向别人的数量。
入度:指向自己的数量。
创建图类: