Graph 为什么在数学中,一个图至少有三个定义?

Graph 为什么在数学中,一个图至少有三个定义?,graph,graph-theory,relation,discrete-mathematics,set-theory,Graph,Graph Theory,Relation,Discrete Mathematics,Set Theory,定义1-2集和函数 2-1套和1系列中的定义 定义3-1关系 为什么我们需要这样的多样性?这些定义中的一些是过时的还是都有其优缺点?无向图和有向图 第三个定义与前两个不同,因为它是关于有向图的,而前两个定义无向图。我们关心有向图和无向图,因为它们适用于不同的情况和解决不同的问题 可以将有向图和无向图视为两个不同的对象 一般来说,无向图比较容易推理,如果有人提到一个“图”时没有精确性,通常指的是无向图 命名边与关联函数 前两个定义几乎相当 第一个定义(V,E,ѱ)为顶点(V的元素)提供“名称

定义1-2集和函数

2-1套和1系列中的定义

定义3-1关系

为什么我们需要这样的多样性?这些定义中的一些是过时的还是都有其优缺点?

无向图和有向图 第三个定义与前两个不同,因为它是关于有向图的,而前两个定义无向图。我们关心有向图和无向图,因为它们适用于不同的情况和解决不同的问题

可以将有向图和无向图视为两个不同的对象

一般来说,无向图比较容易推理,如果有人提到一个“图”时没有精确性,通常指的是无向图

命名边与关联函数 前两个定义几乎相当

第一个定义(V,E,ѱ)为顶点(V的元素)提供“名称”,为边(E的元素)提供名称,并使用“关联函数”ѱ告诉您E中的哪条边对应于V的哪对顶点

第二个定义仅使用(V',E'),不使用ѱ。我称它们为V‘和E’,而不是V和E,以区别于第一个定义。这里的顶点有“名称”,它们是V'的元素;但是边实际上没有单独的名称,并且E'被定义为V'的无向对集合的子集。因此边是V'的无向对元素

以下是一个图表示例:

根据第一个定义:

  • V={a,b,c,d}
  • E={1,2,3}
  • ѱ:E->{V的无序对}
    • 1->ab
    • 2->ac
    • 3->cd
根据第二个定义:

  • V'={a,b,c,d}
  • E'={ab,ac,cd}
如你所见,V'=V,E'是E的图像

如果您不关心边的“名称”,则第二个定义要短一些。但是你用哪一个并不重要;你可以用一个定义证明的定理将等价于你可以用另一个定义证明的定理。这两个定义之间的差异只是集合论对“边”的含义的一个吹毛求疵:它是V的一对元素,还是另一个集合中的一个元素通过一个函数映射到V的一对元素?注意,函数ѱ是两个集合E和E'之间的双射,因此实际上E和E'是同一集合的两个不同名称

算法、编程语言和图形表示 如果您必须使用您最喜欢的编程语言中的图形来编写算法,那么您必须决定如何使用变量和数组以及您使用的所有数据结构来表示图形

对于顶点,人们通常使用V={0,1,2,…,n-1},其中n是顶点的数量。这很方便,因为这意味着您可以将顶点用作数组的索引

对于边,有时我们使用大小为
n*n
顶点关联矩阵对E进行编码,单元格i,j中的1表示顶点i和j之间的边,单元格i,j中的0表示无边。这是上图的关联矩阵(我将a、b、c、d替换为0,1,2,3作为顶点的名称):

有时我们使用列表数组对E进行编码:大小为n的数组,其中单元格i包含顶点索引列表,这些顶点是顶点i的邻居。以下是同一图形的列表数组:

0: 1,2
1: 0
2: 0,3
3: 2
这两种表示更接近第二种定义,因为边没有名称;我们只关心每对顶点是否为边

最近我必须编写一个C++程序,在这里我对边缘进行编号非常重要,因为我希望能够用它们作为矩阵的索引。因此我有V={0,1,2,…,n-1};E={0,1,2,…,m-1};然后,我使用一个函数将边索引映射到一对顶点索引。这个表示法更接近您的第一个定义,它是一个
std::map
forѱ。请注意,我必须在将边索引映射到成对的顶点索引或将成对的顶点索引映射到边索引之间做出选择。如果我觉得有必要,我甚至可以两者兼用。第一个定义并不重要,因为ѱ是一个双射,所以数学家可以不加区别地使用ѱ及其反函数ѱ^-1;但是数据结构std::map不是一个数学函数,反演它可能需要时间

结论
这两个定义是等价的,使用哪一个并不重要。但是如果你需要用图表来编码算法,花一些时间来考虑不同的图形表示,哪一个会使你的算法效率最高。

我投票赞成关闭这个问题,因为它属于CS/MaX站点。
0: 1,2
1: 0
2: 0,3
3: 2