Quick Find算法(算法入门)

Quick Find算法

前言:

在数学领域,有一个有意思的猜想叫做六度空间理论(Six Degrees of Separation),简单的说,就是最多通过6个人,你就可以认识到世界上的任何一个陌生人,就比如,你完全可以通过你大姨的同事的外甥的......认识到比尔盖茨。由此我们可以看出,人与人之间的联系真的十分神奇,那么,我们又是如何在代码的世界中为不同的数据建立联系呢?

正文:

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

如上图所示,有些点是相连的,就好像一个人的人际关系的线;然而,也有一些点是单独在一个角落,无人关心,无人问候......额,言归正传,此时,我们希望帮助0号选手走出自闭,为他介绍朋友,那么我们就可以借用一个方法叫做union,将其与其他的点连接起来。

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

这样,0号同学就和5姑娘 (别想多了) 认识了(connected), 顺便还搭上了富二代6号,一下子就走上了人生巅峰,可喜可贺,可喜可贺。可是,问题又来了,0怎么知道他能和6号扯上关系呢?另一个重要的方法connected来了,它可以让你知道你们俩之前到底有没有关系。ok,接下来直接上代码(java)

Public class QuickFindUF
{
    private int[] id;

    public QuickFindUF(int N) {
        id = new int[N];                 // Quick Find需要在最开始建立一个数组
        for (int i = 0; i < N; i++)      // 然后每个元素等于其索引(index)
            id[i] = i;
    }

    public boolean connected(int p, int q) {
        return id[p] == id[q];           // 检查俩个元素是否相连
    }

    public int find(int p) {             // 查找p所连接的元素
        return id[p];
    }

    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;    // 当检索到id[p](即p所指向的元素),再将id[q]
        }                                     // 赋值id[p](p,q现指向同一位置)
    }
}

那么,Quick Find的工作效率又是如何呢?实话说,不怎么样,如果我们有N个对象并对其进行M次union的操作,他将需要MN次操作,一旦遇到相当大的数据,将会耗费极其多的时间。所以,接下来便引出了其“升级版”:Quick Union, 它会相对的效率更高,我会在之后详细说明这个算法。

代码参考:http://researchhubs.com/post/computing/algorithm-1/quick-find.html

 

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