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