边缘列表与邻接列表vs和邻接矩阵

时间:2014-08-30 15:50:02

标签: algorithm graph

我正在准备创建一个迷宫解决方案。正如这两个问题所述:graphs representation : adjacency list vs matrix&& Size of a graph using adjacency list versus adjacency matrix?他们解释了使用邻接列表与邻接矩阵的不同之处。不幸的是,由于我发现邻接矩阵和边缘列表很少,我无法决定边缘列表与其他两个边缘列表的优缺点。

通过迷宫的相邻列表(我认为)的一个例子是:

insertVertex(V)               : O(1)
insertEdge(Vertex, Vertex, E) : O(1)
removeVertex(Vertex)          : O(deg(v))
removeEdge(Edge)              : O(m)
vertices()                    : O(n)
edges()                       : O(m)
areAdjacent(Vertex, Vertex)   : O(min(deg(v),deg(w))
endVertices(Edge)             : O(1)
incidentEdges(Vertex)         : O(deg(v))
space complexity              : O(n+m)

所以我的问题是,这个迷宫解决问题的最佳时间花费了边缘列表,邻接列表或邻接矩阵?

1 个答案:

答案 0 :(得分:0)

让我们从古典"开始迷宫。它们被定义为矩形网格,其每个单元格是走廊或墙壁。玩家可以在四个方向之一(顶部,左侧,底部,右侧)移动一个单元格。迷宫的例子:

S..#.##E
.#.#.#..
.#...#.#
.#.###.#
##.....#

玩家从标有 S 的位置开始,并且应该到达 E 位置。

现在让我们将每个空白单元格显示为图形顶点。然后每个顶点最多可以有4个邻居。在空间使用方面,邻接列表显然胜出 - 4 * V vs V ^ 2

网格迷宫的最简单有效的最短路径算法是BFS。对于巨大的迷宫,它可以被A*取代。这两种算法都只有一个边缘相关的" operation:获取给定节点的所有邻居。这是 O(1)(我们最多有4个邻居)用于邻接列表, O(V)用于邻接矩阵。

为了节省空间,我们只能为十字路口创建顶点。但是这对上面的计算没有影响(顶点数量会下降,但仍会大于4)。

作为结论,迷宫邻接列表的网格表示在时间和空间使用方面都获胜。

一般情况

每个迷宫都可以建模为一组房间(顶点),走廊(边缘)通向不同的房间。通常房间的数量远远大于单人房间的走廊数量。在这种情况下,邻接列表的参数仍然存在。

附加说明。对于网格迷宫,通常使用网格表示(带有布尔运算的二维数组)更容易,而不会创建额外的图形结构。