如何进行并集查找二次算法?

2022-09-04 03:43:13

在快速查找算法的此实现中,构造函数执行步骤,也是如此。Nunion()

讲师说,处理对象上的命令序列太昂贵了,当它一次访问一个数组元素时,联合怎么能是二次的呢?unionN^2NunionN

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;
    }
}

答案 1

每次调用方法都需要您循环访问数组,这需要时间。如果调用方法时间,则所需的时间为 。unionidO(n)unionnn*O(n) = O(n^2)

您可以通过提高连接方法的时间复杂度来提高方法的时间复杂度,可能,但这只是一次操作。我相信你的教科书详细解释了这一点。unionO(1)O(log n)


答案 2

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

    for (int i=0; i<id.length; i++)

请注意,该算法称为“快速查找”,因为每个查找 () 操作都需要恒定时间。但是,对于此算法,您最终需要在操作中付费,如您的问题中所述。connected(int p, int q)union

还有另一种算法快速联合,可以缩短操作时间。但随后不会保留(但比线性时间更好)。unionfindO(1)