【问题标题】:Do I have to implement Adjacency matrix with BFS?我必须用 BFS 实现邻接矩阵吗?
【发布时间】:2016-07-25 23:35:37
【问题描述】:

我正在尝试使用队列实现 BFS 算法,我不想寻找任何用于学习目的的在线代码。我所做的只是遵循算法并尝试实现它。我有一个关于邻接矩阵(图的数据结构)的问题。

我知道一种常见的图形数据结构是邻接矩阵。所以,我的问题是,我是否必须与 BFS 算法一起实现邻接矩阵,否则没关系。

我真的很困惑。 让我困惑的一件事,图表数据,如果没有数据结构,这些数据应该存储在哪里?

真诚的

【问题讨论】:

  • 试试邻接表...
  • pop_back的返回类型是void
  • 与其编辑您的问题以提出根本不同的问题然后不接受答案,我建议您在这里提出一个全新的问题。

标签: algorithm data-structures


【解决方案1】:

广度优先搜索假设您有某种方式来表示您正在使用的图形结构,其效率取决于您选择的表示方式,但您不受限于使用邻接矩阵。 BFS 的许多实现都以某种方式隐式表示图(例如,作为存储迷宫的 2D 数组或作为某种游戏)并且工作得很好。您还可以使用邻接表,这对我们在 BFS 中特别有效。

您将要编写的特定代码将取决于图形的表示方式,但不要拘泥于以一种方式进行。选择最适合您的应用程序的方法。

【讨论】:

    【解决方案2】:

    选择数据结构的最佳方式是根据操作。掌握完整的操作列表,根据对问题重要的标准评估实现:空间、速度、代码大小等。

    对于 BFS,操作非常简单:

    Set<Node> getSources(Graph graph) // all in graph with no in-edges
    Set<Node> getNeighbors(Node node) // all reachable from node by out-edges
    

    现在我们可以根据 n=节点数来评估图形数据结构选项:

    • 邻接矩阵:
      • getSources 是 O(n^2) 时间
      • getNeighbors 是 O(n) 时间
    • 邻接列表向量(单独):
      • getSources 是 O(n) 时间
      • getNeighbors 是 O(1) 时间
    • 邻接列表的“聪明”向量:
      • getSources 是 O(1) 时间
      • getNeighbors 是 O(1) 时间

    聪明点只是在构建图时保持源集,因此成本通过边插入来摊销。即,当您创建一个节点时,将其添加到源列表中,因为它没有出边。添加边时,请从源集中删除 to-node。

    现在您可以根据运行时间做出明智的选择。对空间、简单性或任何其他考虑因素也这样做。然后选择并实施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2016-11-05
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多