Algorithm 一种在林中将节点聚类成不同树的算法

Algorithm 一种在林中将节点聚类成不同树的算法,algorithm,Algorithm,n-树的森林在那里 用户会给我们一些边 示例:-1 2、3 4表示1和2、3和4已连接 任务是找出哪个节点是哪个树的一部分 我的方法: 构建一个数组,数组的索引表示节点。 array[i]=j,这里它表示iisj的根 这是基本的方法。通过这些,我们可以很容易地知道哪个节点是哪个树的一部分 时间复杂性O(N^2) 但我需要高效的算法,请帮我。听起来你在追求: 不相交集数据结构是一种数据结构,它跟踪被划分为多个不相交(非重叠)子集的一组元素。union–find算法是对此类数据结构执行两个有用操作的

n-树的森林在那里

用户会给我们一些边

示例:-1 2、3 4表示1和2、3和4已连接

任务是找出哪个节点是哪个树的一部分

我的方法

  • 构建一个数组,数组的索引表示节点。
    array[i]=j
    ,这里它表示
    i
    is
    j
    的根
  • 这是基本的方法。通过这些,我们可以很容易地知道哪个节点是哪个树的一部分

    时间复杂性O(N^2)


    但我需要高效的算法,请帮我。

    听起来你在追求:

    不相交集数据结构是一种数据结构,它跟踪被划分为多个不相交(非重叠)子集的一组元素。union–find算法是对此类数据结构执行两个有用操作的算法:

    • 查找:确定特定元素所在的子集。这可用于确定两个元素是否在同一个子集中
    • 并集:将两个子集合并为一个子集

    不相交集林是数据结构,其中每个集由树数据结构表示,其中每个节点都持有对其父节点的引用(请参见意大利面堆栈)

    在不相交的集合林中,每个集合的代表是该集合树的根<代码>查找跟随父节点,直到到达根节点
    Union
    通过将一棵树的根附加到另一棵树的根,将两棵树合并为一棵树


    这里的关键是维护一个类似于图的邻接列表,然后按照以下方式执行DFS:-

    1. find all nodes which do not have incoming edges and form list of roots.
    2. do DFS() on each root r and add root[i] = r for each node visited in DFS.
    3. So to check if node belongs to a tree you can just check its root. 
    

    时间复杂度:-
    O(E)
    用于查找DFS的根&
    O(E)
    ,因此
    O(E)
    总的来说,E是给定的边数

    另一种方法可以是:

    for each node
       parent[node] = -1
    
    for each node
       if(not visited node)
         parent[node]=node
         dfs(node , parent)
    
    
    
    dfs(node , parent) :
    for each node u connected to node :
    if(not visited u)
    {
      parent[u] = parent
      dfs(u, parent)
    }
    

    这给了
    O(1)查询时间
    。每个节点访问一次需要
    O(N)个时间和O(N)个空间,其中N=节点数

    如何确定两个节点是否通过边连接,边将由用户给定。