如何将每个集合存储在不相交的集合林中



我自己正在用Java编写代码。。。我创建了一个GraphNode类来表示具有指向其父节点的指针的节点。

我还创建了一个DisjointSet类,该类包括一个MakeSet方法,该方法创建了GraphNode对象并使其父引用引用自己。

问题是:我如何存储每个节点,以便稍后在Union和FindSet中轻松访问它?我最初认为将其存储在BST中,但我必须创建一个自定义TreeNode类,该类不仅存储值,还存储对GraphNode的引用。有没有更简单的方法?

绝对有一个更简单的方法:忘记所有的节点业务。节点只是概念性的,不需要从字面上实现它们,而且不实现更容易。

您只需要两个int数组。一个存储父母,一个存储等级。因此,在一种伪代码中,它看起来像这样:

disjoint_set {
int[] parent, rank;
makeset(int n)
{
rank = new int[n];
parent = new int[n];
for(int i = 0; i < n; i++)
parent[i] = i;
}
int find(int i)
{
if (parent[i] != i)
parent[i] = find(parent[i]);
return parent[i];
}
void union(int x, int y)
{
x_root = find(x);
y_root = find(y);
if (x_root != y_root) {
if (rank[x_root] < rank[y_root])
parent[x_root] = y_root;
else if (rank[x_root] > rank[y_root])
parent[y_root] = x_root;
else {
parent[y_root] = x_root;
rank[x_root]++;
}
}
}
}

最新更新