绪论
10-15章节我们介绍了数据结构中重要的一部分——树的概念和一些较为重要的应用。从Lecture 16,我们开始介绍数据结构重要的另外一个部分——图。
事实上,从图论的角度来看,树应该是隶属于图这部分知识的一个重要部分,树是特殊的一类图。但从很多功能的实现来看,由于树有根节点到各个结点的路径唯一和无环的性质,同样的功能在树结构实现起来可以看作图结构的简化,我个人觉得这是在介绍图的问题之前先介绍树的原因。
16-1主要还是介绍图的基本概念·······介绍了好几遍了。
Undirected Graphs
首先需要知道图这种数据结构描述了些什么样的概念?从离散数学的术语来说,图描述了若干个元素组成的集合和元素与元素之间的二元组(二元关系两个元素之间的相对次序是有意义的)组成的集合,简单来说,就是一个数据结构包括了若干个同类型的元素以及他们两两之间的关系。
图与只存储元素的简单数据结构的差别就在于元素与元素之间存在的联系需要作为一个对象进行存储。
例如从组词听起来和图数据结构最相关的对象——图片(这里以最简单的存储方式为例),由n*m的像素点组成,每个像素点有色号等信息,相邻的像素点存在上下左右的关系,但我们其实可以发现这些关系对整个图片或者像素点的信息几乎没有任何的影响,所以不需要进行存储,只需要简单的二阶数组数据结构即可。
但对于同样的n*m方阵,我们现在希望从某个方格到某个方格,点可以根据规则从某个点到另外的点,对于这个问题,这个规则下定义出来的某个点到某个点的“指向”是我们需要进行操作和关注的对象。此时的方阵就可以构成一个图的数据结构,“指向”就是存在于元素与元素之间的关系。
元素在图中称为顶点,二元组称为边,我们可以根据二元组构成的连通关系是否为偏序关系将图分为有向图和无向图,即有向图边存在明确的点到点的方向,无向图边的两个点不存在一个点到另一个点的方向,从哪个点到哪个点都可以。
我个人还是建议先打好离散数学的基础再来学习数据结构中的图,这样会有很多不一样的认识,因为图论实际上本来就是组合数学重要的一部分,计算机类的书籍对图论部分的介绍和解释很多都是断续的,强行理解记忆起来会存在很多的障碍和困惑。
这里我们只对课本上提到的概念进行介绍,首先是无向图:
Vertices
顶点集合我们用大V表示:
Edges
边就是点与点之间的关系,无向图边的两个点不存在相对关系。边的集合用大E表示: