动态连通性问题之快速查找算法笔记

快速查找(贪心算法)

目的:通过并查集解决动态连通性问题

定义: 在一个N个元素的数组中,当且仅当 p、q的id相等时,p和q是连通的。

课程链接
github地址

接口

/**
 * 判断两个元素是否连通: 比对id值是否相等即可
 */
public boolean connected(int p, int q);


/**
 * 连通p、q
 * 将所有与p相同id的元素的id值都变更为q的id值
 */
public void union(int p, int q);

算法实现

/**
 * 动态联通问题之快速查找(贪心算法)
 *
 * 定义: 在一个N个元素的数组中,当且仅当 p、q的id相等时,p和q是连通的。
 *
 */
public class QuickFindUF {

    private int[] id ;

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

    /**
     * 判断p、q是否连通
     * @param p
     * @param q
     * @return
     */
    public boolean connected(int p, int q) {
        return id[p] == id[q];
    }

    /**
     * 连通p、q
     * 将所有与 p 相同 id 的元素的 id 值 都变更为 q 的 id 值
     * @param p
     * @param 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;
        }
    }

    public static void main(String[] args) {
        QuickFindUF quickFindUF = new QuickFindUF(10);
        quickFindUF.union(0,5);
        quickFindUF.union(5,6);
        quickFindUF.union(1,2);
        quickFindUF.union(2,7);
        quickFindUF.union(8,3);
        quickFindUF.union(3,4);
        quickFindUF.union(4,9);

        System.out.println(quickFindUF.connected(1,3));
        System.out.println(quickFindUF.connected(8,9));
    }

}

算法效率:

image

总结

查询速度为1(即直接比对元素的id值即可),但进行N次连通操作的时间复杂度为指数级增长,速度太慢。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.问题描述: 有N个对象,对象间可以连通。假设有一个命令用来连接两个对象,将两个对象传入该命令就会连接两者,还有...
    luckygong阅读 4,744评论 0 0
  • 算法第一章 动态连通性 首先,我们讲到第一个问题,也就是第三张PPT,动态连通...
    心语yx阅读 3,465评论 0 0
  • 汉水渔夫水上游阅读 1,738评论 0 0
  • 燕子,你常常会在心里倚靠 神:这件事我该怎么做?我怎么回答?我怎么能更理解我的孩子?我怎样变得和他们一样?怎样跟她...
    永远福分阅读 1,184评论 0 0
  • 红楼终是一场梦 水中月,镜中花 为色为财为官为情 人去楼空,人亡家散 同床异梦,各怀鬼胎,鸡犬不宁 寒塘雁影,冷月...
    听心随性阅读 1,621评论 0 0

友情链接更多精彩内容