Quick Union算法(算法入门2)

Quick Union算法

在之前我简单的解释了一个叫做Quick Find的方法,其中的union方法效率太低(N),一旦遇到较大的数据时,就很难堪重用,所以今天我来介绍一个稍微好一点算法——Quick Union。

在Quick Union中,我们要引入一个新的概念,那就是root。顾名思义,root即为根,在union方法中,每当我们把两个元素进行连接,都是直接对他们的root进行操作,每当有新的元素连接到root上,我们便称其为一个新的branch(分支)。就像这样不断地连接,最后我们将可以得到一个倒立的树(最顶部为root,下面连着各种branch)。在最开始,每一个元素的root都是它自己。

Quick Union算法(算法入门2)_第1张图片

便如同上图所示,9的root就是2,0的root则是5,此时如果我们想把0和9连接起来,只需要让他们的root相连即可。如此,我们便完成了从Quick Find算法那种“扁平化”的结构,到如今Quick Union树形结构的过渡。那么此算法具体是如何实现的呢?翠花,上代码!(java)

public class QuickUnion {

    private int[] id;

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

    private int root(int i) {
        while (i != id[i]) i = id[i]; // 不断向上遍历,直到找到root(即索引与其中元素相同)
        return i;
    }

    public boolean connected(int p, int q) {
    return root(p) == root(q);         // 检验p,q的root是否相同
    }

    public void union(int p, int q) {
        int i = root(p);
        int j = root(q);
        id[i] = j;                     // 将q的root连接到p的root上
    }
}

接下来我们简单地对比一下这两种算法

算法 初始化 union find
Quick Find N N 1
Quick Union N *N(包含find损耗) N(最坏情况)

 

通过上图可以很容易看出Quick Union算法的find的效率很低(N),而且每次union时都需要调用find方法,在最坏的情况下,其时间复杂度为O(logN),相比于Quick Find的O(N²)是要好一些,不过还是有些强差人意,之后我将介绍一个算法叫做Union Find,它将在这两个算法的基础之上在进行改进,在实际应用中也更加实用。

 

 

你可能感兴趣的:(Quick,Union,算法,算法入门)