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

Java 如何在不相交的集合林中存储每个集合?,java,data-structures,disjoint-sets,Java,Data Structures,Disjoint Sets,试着自己用Java编写代码。。。我创建了一个GraphNode类来表示具有指向其父节点的指针的节点 我还创建了一个DisjointSet类,该类包含一个MakeSet方法,该方法创建一个GraphNode对象并使其父引用引用自身 问题是:如何存储每个节点,以便稍后在Union和FindSet中轻松访问它?我的第一个想法是将其存储在BST中,但我必须创建一个自定义TreeNode类,该类不仅存储值,还存储对GraphNode的引用。有更简单的方法吗?绝对有更简单的方法:忘记所有的节点业务。这些节点

试着自己用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]++;
            }
        }
    }
}
不相交集{
int[]父级,秩;
生成集(int n)
{
秩=新整数[n];
父项=新整数[n];
对于(int i=0;i秩[y_根])
父[y_根]=x_根;
否则{
父[y_根]=x_根;
秩[x_根]+;
}
}
}
}