Algorithm 我必须用BFS实现邻接矩阵吗?

Algorithm 我必须用BFS实现邻接矩阵吗?,algorithm,data-structures,Algorithm,Data Structures,我正在尝试使用队列实现BFS算法,我不想为了学习而寻找任何在线代码。我所做的只是遵循算法并尝试实现它。我有一个关于邻接矩阵(图的数据结构)的问题 我知道一种常见的图形数据结构是邻接矩阵。所以,我这里的问题是,我必须实现邻接矩阵和BFS算法,还是不重要 我真的很困惑。 让我困惑的事情之一是图形数据,如果没有数据结构,这些数据应该存储在哪里 诚恳地说,广度优先搜索假设您有某种方式来表示正在使用的图形结构,其效率取决于您选择的表示方式,但您不必使用邻接矩阵。BFS的许多实现都以某种方式隐式表示了图形(

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

我知道一种常见的图形数据结构是邻接矩阵。所以,我这里的问题是,我必须实现邻接矩阵和BFS算法,还是不重要

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


诚恳地说,

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


您将要编写的特定代码将取决于图形的表示方式,但不要感到必须以一种方式执行。选择最适合您的应用程序的选项。

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


您将要编写的特定代码将取决于图形的表示方式,但不要感到必须以一种方式执行。选择最适合您的应用程序的数据结构。

选择数据结构的最佳方法是操作。手头有一个完整的操作列表,评估对问题很重要的实现wrt标准:空间、速度、代码大小等

对于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
Set-getSources(Graph-Graph)//无in边的all-in图
Set getneighbories(Node Node)//所有可通过out-edges从节点访问的节点
现在,我们可以根据n=节点数来评估图形数据结构选项:

  • 邻接矩阵:
    • getSources是O(n^2)时间
    • GetNeights是O(n)时间
  • 邻接列表向量(单独):
    • getSources是O(n)时间
    • GetNeights是O(1)时间
  • 邻接列表的“聪明”向量:
    • getSources是O(1)时间
    • GetNeights是O(1)时间
聪明之处在于在构建图时维护源集,因此成本通过边插入进行摊销。即,在创建节点时,将其添加到源列表中,因为它没有输出边。添加边时,从源集中删除“到”节点


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

选择数据结构的最佳方法是操作。手头有一个完整的操作列表,评估对问题很重要的实现wrt标准:空间、速度、代码大小等

对于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
Set-getSources(Graph-Graph)//无in边的all-in图
Set getneighbories(Node Node)//所有可通过out-edges从节点访问的节点
现在,我们可以根据n=节点数来评估图形数据结构选项:

  • 邻接矩阵:
    • getSources是O(n^2)时间
    • GetNeights是O(n)时间
  • 邻接列表向量(单独):
    • getSources是O(n)时间
    • GetNeights是O(1)时间
  • 邻接列表的“聪明”向量:
    • getSources是O(1)时间
    • GetNeights是O(1)时间
聪明之处在于在构建图时维护源集,因此成本通过边插入进行摊销。即,在创建节点时,将其添加到源列表中,因为它没有输出边。添加边时,从源集中删除“到”节点


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

尝试邻接列表。
pop_back
的返回类型是
void
。而不是编辑你的问题问一些根本不同的问题,然后拒绝回答,我建议在这里问一个全新的问题。试试邻接列表。
pop_back
的返回类型是
void
。我建议在这里问一个全新的问题,而不是编辑你的问题来问一些根本不同的问题,然后不接受答案。