【问题标题】:Edge lists vs adjacency lists vs and adjacency matrix边缘列表与邻接列表与邻接矩阵
【发布时间】:2014-08-30 15:50:02
【问题描述】:

我正在准备创建一个迷宫解决程序。正如这两个问题中所述: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)

所以我的问题是,对于这个迷宫解决问题,边列表、邻接列表或邻接矩阵哪个时间成本最好?

【问题讨论】:

  • 您使用的是有向图还是无向图?每个表示都有一些优点和缺点。你必须根据你想要做什么(哪些函数会经常执行)和你的图是什么样子(强连接,即m close n*n,或不是?)来选择。
  • 这取决于您正在编写的给定算法。请提供更多信息。

标签: algorithm graph


【解决方案1】:

让我们从“经典”迷宫开始。它们被定义为矩形网格,每个单元格都是走廊或墙壁。玩家一次可以在四个方向之一(上、左、下、右)移动一个单元格。迷宫示例:

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

玩家从标记为 S 的位置开始,应该到达位置 E

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

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

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

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

一般情况

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

补充说明。对于网格迷宫,直接使用网格表示(带有布尔值的二维数组)通常更容易,而无需创建额外的图形结构。

【讨论】:

    猜你喜欢
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2018-04-25
    • 2015-05-31
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多