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

时间:2019-12-23 04:33:17

标签: graph linked-list nodes adjacency-matrix adjacency-list

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

为什么每个顶点都不能像其在决策树中那样,仅保留对其所连接的顶点的引用?在我看来,这似乎更直观。

谢谢!

2 个答案:

答案 0 :(得分:1)

嗯,这源于一种设计理念。每当您有多对多关系时,您都会介绍一个经纪人来保持这种关系。这打破了关系,使管理代码和编写数据结构变得更加容易。

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

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

答案 1 :(得分:0)

邻接矩阵或邻接列表不是必需的。还有其他选择。如果您使用的是C ++,请使用vector&map。如果顶点/节点的编号是从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. 

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