Java 联合查找二次算法是如何实现的?

Java 联合查找二次算法是如何实现的?,java,algorithm,Java,Algorithm,在这个快速查找算法的实现中,构造函数执行N步骤union() 讲师说,union太贵了,因为它需要N^2来处理Nunion对象上的N命令序列,当它一次访问一个数组元素时,union怎么可能是二次的? public class QuickFind { private int[] id; public QuickFind(int N) { id = new int[N]; for (int i=0; i<N; i++) {

在这个快速查找算法的实现中,构造函数执行
N
步骤
union()

讲师说,
union
太贵了,因为它需要
N^2
来处理
N
union
对象上的
N
命令序列,当它一次访问一个数组元素时,
union
怎么可能是二次的?

public class QuickFind
{
    private int[] id;

    public QuickFind(int N) {
        id = new int[N];
        for (int i=0; i<N; i++) {
            id[i] = i;
        }
    }

    public boolean connected(int p, int q) {
        return id[p] == id[q];
    }

    public void union(int p, int q) {
        int pid = id[p];
        int qid = id[q];

        for (int i=0; i<id.length; i++)
            if (id[i] == pid)
                id[i] = qid;
    }
}
公共类快速查找
{
私有int[]id;
公共快速查找(int N){
id=新的整数[N];

对于(int i=0;i每次调用
union
方法都需要迭代
id
数组,这需要
O(n)
时间。如果调用
union
方法
n
次,则所需时间为
n*O(n)=O(n^2)


通过提高连接方法的时间复杂度,可以将
union
方法的时间复杂度提高到
O(1)
,可能是
O(logn)
,但这只是一次性操作。我相信您的教科书会详细解释这一点。

Union
快速查找的操作是二次
O(n^2)
n
操作,因为每个操作都需要
O(n)
时间,在
Union(int p,int q)内部的for循环中很容易注意到这一点


用于(int i=0;他是说N个联合操作的序列需要二次时间,而不是一次调用。假设您使用大小为
N
的输入创建一个新的
QuickFind
数据结构。最初,有
N
个连接的组件,每个组件的大小为1。例如,如果您想要将所有组件统一为一个,您必须调用
union
operation
n-1
次。由于每个union调用取O(n),最终的复杂性为O(n^2)。通过使用路径压缩和按秩并集,可以使用O(α(n))进行并集并找到根
    for (int i=0; i<id.length; i++)