Algorithm 迭代连接的组件

Algorithm 迭代连接的组件,algorithm,data-structures,connected-components,Algorithm,Data Structures,Connected Components,我想迭代一个包含107个顶点的无向图的每个连通部分。i、 e.我想对每个向量V1…Vk调用函数f(Vi),其中Vi是一个向量,包含连接到图的第i个连接组件中每个节点的数据 最快的算法是什么 我最初的想法是: 将所有未访问的顶点存储在堆中,然后重复从堆中获取顶点,使用DFS查找其连接的组件Vi,调用f(Vi)并从堆中删除组件中的所有顶点 Find union Find disjoint set的一个变体,它不仅支持有效的集并,而且使迭代集和查找其成员的效率更高。(这可能吗?) 跑经典。通常,这会操

我想迭代一个包含107个顶点的无向图的每个连通部分。i、 e.我想对每个向量V1…Vk调用函数f(Vi),其中Vi是一个向量,包含连接到图的第i个连接组件中每个节点的数据

最快的算法是什么

我最初的想法是:

  • 将所有未访问的顶点存储在堆中,然后重复从堆中获取顶点,使用DFS查找其连接的组件Vi,调用f(Vi)并从堆中删除组件中的所有顶点
  • Find union Find disjoint set的一个变体,它不仅支持有效的集并,而且使迭代集和查找其成员的效率更高。(这可能吗?)
  • 跑经典。通常,这会操纵一个对象

  • 创建一个哈希表,将节点映射到节点的链接列表

  • 迭代每个节点

    a。在不相交集数据结构中查找代表节点

    b。如有必要,为哈希表中的代表节点创建一个链表

    c。将节点添加到与代表节点关联的链接列表中

  • 这需要有效的线性时间(即|(|e |+|V |))(在广泛接受的不相交集是有效的线性时间的理解下)


    您现在有了一个哈希表,其条目数是连接组件的数量。每个值都是连接组件中所有节点的链接列表。您现在可以在任何需要的地方进行线性迭代。

    是的,DFS是一个很好的选择。但是请记住,在给定的范围内,如果运行递归DFS,可能需要10^7个节点面临内存问题。因为在这种情况下,所有节点都将形成一个链,并且堆栈中需要巨大的大小,从而导致堆栈溢出(:D)

    试着做:

  • 使用顺序为O(V+E)或
  • 简单使用BFS(考虑到简单性和节点数量的最佳选择)顺序(V+E)

  • BFS通常用于最短路径问题,但也可用于许多其他应用程序,如本应用程序。这将从堆中获取队列数据结构的空间,其中通常的递归DFS从堆栈中获取空间。

    如果将图形存储为邻接列表,并且顶点由
    1
    n-1的整数表示de>,则不需要联合查找表或哈希表

    让我们假设
    g[v]
    是与
    v
    相邻的顶点列表(向量)。此外,让
    cc
    是列表(向量向量向量)列表,其中
    cc[i]
    表示
    i-th
    连接组件中的顶点。出于实现目的,让
    访问[v]=true
    当且仅当我们在将要使用的
    DFS
    例程中检查
    v
    时。然后伪代码如下所示:

    dfs(v, current_cc):
       visited[v] = true
       current_cc.append(v)
       for u in g[v]:
          if not visited[u]:
             dfs(u, current_cc)
    
    for v = 0 to n-1:
       visited[i] = false
    
    for v = 0 to n-1:
       if not visited[v]:
          current_cc = []
          dfs(v, current_cc)
          cc.append(current_cc)
    
    //From now, cc[i] is a list of vertices in the i-th connected component, 
    //so we can easily iterate and call whatever we want on them.
    

    当然,DFS是一种实现这一点的方法,但这可能取决于您是为了一次性计算还是经常发生的计算而尝试对此进行优化。通过更多的簿记,您不必每次都重新发现连接的组件。为什么需要堆呢?使用一个简单的哈希集,DFS/BFS都可以工作,并且是最受欢迎的imal您可以这样做。我们可以假设您将图形存储为邻接列表吗?我们可以假设顶点的编号从0到N-1,其中N是顶点的总数吗?@pkacprzak是的。