将节点聚类到森林中的不同树中的算法

时间:2014-02-14 09:36:06

标签: algorithm

n树的森林在那里。

用户会给我们一些边缘。

示例: - 1 2,3 4,手段1和2,3和4连接

任务是找到哪个节点属于哪个树?

我的方法: -

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

    时间复杂度 O(N ^ 2)

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

3 个答案:

答案 0 :(得分:2)

听起来好像你在a disjoint-set data structure / the union-find algorithm之后:

  

不相交集数据结构是一种数据结构,它跟踪分成多个不相交(非重叠)子集的一组元素。联合查找算法是一种对这种数据结构执行两个有用操作的算法:

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

...

     

不相交集林是数据结构,其中每个集由树数据结构表示,其中每个节点都拥有对其父节点的引用(请参阅spaghetti堆栈)。

     

在不相交的林中,每个集合的代表是该集合树的根。 Find跟随父节点,直到到达根节点。 Union通过将一个树的根连接到另一个树的根来将两棵树合并为一个。

答案 1 :(得分:0)

这里的关键是维护一个邻接列表,如图表,然后按照以下方式进行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)用于查找根&因此O(E)为DFS O(E)整体,其中E是给定的边数

答案 2 :(得分:0)

另一种方法可以是:

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) query time。需要O(N) time as each node is visited once and O(N) space , where N = number of nodes