Graph 为什么要使用邻接矩阵或邻接列表?

Graph 为什么要使用邻接矩阵或邻接列表?,graph,linked-list,nodes,adjacency-matrix,adjacency-list,Graph,Linked List,Nodes,Adjacency Matrix,Adjacency List,我刚刚开始学习图形,让我困惑的是为什么我们需要使用外部数据结构(如矩阵或列表)来存储图形的哪些顶点连接到其他顶点 为什么每个顶点不能像决策树中的节点那样,只保留对其连接顶点的引用?对我来说,这似乎更直观 谢谢 邻接矩阵或邻接列表不是强制性的。还有其他选择。如果你使用C++,那么使用矢量地图。如果顶点/节点从0-N开始编号,则不需要贴图,而需要向量。 例如: vector < vector < int > > graph; // while vertex/node are

我刚刚开始学习图形,让我困惑的是为什么我们需要使用外部数据结构(如矩阵或列表)来存储图形的哪些顶点连接到其他顶点

为什么每个顶点不能像决策树中的节点那样,只保留对其连接顶点的引用?对我来说,这似乎更直观


谢谢

邻接矩阵或邻接列表不是强制性的。还有其他选择。如果你使用C++,那么使用矢量地图。如果顶点/节点从0-N开始编号,则不需要贴图,而需要向量。 例如:

vector < vector < int > > graph; // while vertex/node are numbered from 0-N.
map < int, vector<int> > graph; // when vertex/node can be any number

graph[i].push_back(x); // insertion of node x in i'th list. 
vector>图形;//而顶点/节点从0-N开始编号。
mapgraph;//当顶点/节点可以是任意数时
图[i]。推回(x);//在第i个列表中插入节点x。

遍历第i个列表将显示与节点i连接的节点。

好吧,这来自于设计理念。每当你有一个多对多的关系时,你就会引入一个经纪人来维持这种关系。这打破了这种关系,使管理代码和编写数据结构变得更容易

例如,如果我们将所有顶点(称为列表B)信息保留到连接到
列表B
的顶点(称为a),则列表B的任何顶点中的任何更改都需要传播到a。如果删除某些边,则需要更新a中的边。这可能会变得非常混乱。这也违反了单一责任原则。现在我的顶点可以从两个轴修改-如果它自己修改或者它的任何连接被修改


然而,如果我们对数据结构建模,使每个顶点都可以独立地改变,并且顶点中的任何改变都不需要对其他顶点进行变异,那么我们的生活就会变得更简单。我们可以有一个
管理器
代理
,它管理每个顶点之间的关系,而不是每个顶点管理这些关系。这个关系经理是邻接列表/邻接矩阵。

这是个好问题。如果您的问题允许,“隐藏”节点内的邻接没有错。但是,许多图形操作需要所有顶点或所有边。“外部”表示简化了所有这一切。另一个原因是,如果节点不包含数据,则根本不需要显式节点。在这种情况下,可以使用连续整数隐式表示节点。它们为邻接列表的数组编制索引。最后一点需要注意的是,标记边时,通常不需要邻接列表。对于每个节点。您需要一个从标签到下一个顶点的映射。最后,当边被标记时,从标签到下一个顶点的映射比简单列表更好。确切的结构取决于你正在解决的问题。一个非常酷的高度专业化的图形表示(通常在您询问的所有内部实现)示例用于高效地表示计算几何算法的多面体。