union如何找到二次算法?

Alg*_*lgo 9 java algorithm

在快速查找算法的此实现中,构造函数采取N步骤union().

教师说这对于处理对象上的命令序列union来说太昂贵了,当它一次访问一个数组元素时,怎么可能是二次的呢?N^2N unionNunion

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

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

通过使连接方法的时间复杂度更高,可以提高union方法O(1)的时间复杂度O(log n),但这只是一次操作.我相信你的教科书会详细解释这一点.