【问题标题】:Graph representation using linked list & matrix使用链表和矩阵的图形表示
【发布时间】:2011-12-21 08:59:55
【问题描述】:

我知道如何使用链表或矩阵来实现图形。但我想知道何时使用链表以及何时使用矩阵进行图形表示?

【问题讨论】:

  • 链表与矩阵处于不同的抽象级别。矩阵是数字的 2D 索引集合,因此您应该将“可迭代的、非索引的边集合”与邻接矩阵或链表与 2D 边数组进行比较,并忽略所有其他可能表示。

标签: algorithm data-structures graph


【解决方案1】:

V = 图中的顶点数

支持矩阵的点:
1.您可以在恒定时间内访问一条边(找出两个顶点之间是否存在一条边),而在使用邻接列表时,它需要 O(degree(vertex)) 时间。
2. 如果你的图很密集,矩阵是好的。否则会浪费空间,因为它使用 O(V*V) 空间。

有利于邻接表的点:
1. 迭代获取顶点的邻居需要 O(V) 时间,而如果使用邻接列表则需要 O(degree(Vertex))。
2. 邻接表不占空间。

【讨论】:

    【解决方案2】:

    通常,当您的图表为 dense 时。使用 matrix 是个好主意,因为忽略了未使用内存和不需要读取的“损失”。
    当您想快速知道是否存在边时,通常也会使用矩阵,或者您想在图上执行矩阵操作 [例如Page Rank] (*)

    如果您要在读取每个顶点时使用所有边(例如:在 BFS 上),则通常首选链表。

    (*)请注意,由于图非常稀疏,幕后的页面排名通常使用链表,但我们将其视为“稀疏矩阵”...

    【讨论】:

      【解决方案3】:

      这两种实现在内存消耗和复杂性方面有两个根本区别。

      1. 矩阵表示允许随机访问元素,常量 插入和删除元素的时间,但(通常)它消耗 更多空间。
      2. 另一方面,链表更内存友好,但 访问元素和邻居可能需要线性时间

      【讨论】:

        【解决方案4】:

        这取决于您的问题和需求。当你需要速度并且有大存储空间时使用矩阵(如果你的矩阵很大),如果你需要节省空间,则使用链表,权衡有点慢。

        【讨论】:

        • 不完全正确。带有邻接列表的 BFS 是 O(|V|+|E|),其中使用矩阵是 O(|V|^2),这会使矩阵求解速度变慢。
        • hmm... 通常我面临的利用图来解决的问题,具有下一个要选择的节点是已知的属性。使用矩阵是 O(1),而链表是 O(n)(其中 n 是当前节点的子节点数)
        【解决方案5】:

        你总是使用矩阵。

        内存中的矩阵表示有多种技术,包括使用链表表示稀疏矩阵的各种方法。任何关于矩阵计算的好书都会有很多关于何时使用它们的表示和指导;根据您的图表,其中一种不太常见的表示可能是合适的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多