四、内功算法之连通性问题路径压缩优化查询

问题:虽然不会生成很高得树,但是在查询时还是一步一步得查找根节点,这块还能优化

思路:在查询根节点时,将当前得根节点设置为爷爷节点,从而下次在查询时,原查询路径缩短为一半,节点越多,效果越明显。

代码实现

package com.jd.testjava.algorithm;

/**
 * 连通性问题
 * 使用树结构实现
 * 快速合并算法优化(将小树合并到大树下面,避免大树合并到小树,高度成倍增长)
 * 带权(高度)快速合并算法
 *
 * @author lichenyang8
 * @date 2019/3/25
 */
public class QuickUnionAlgorithmPlus implements IAlgorithm{
    private int[] ids;
    private final int length;

    //统计树高
    private int[] sz;

    /**
     * 初始化数组
     * @param length
     */
    public QuickUnionAlgorithmPlus(int length){
        this.length = length;

        ids = new int[length];
        sz = new int[length];
        for (int i = 0; i < length; i++) {
            ids[i] = i;
            sz[i] = 1;
        }
    }

    /**
     * 查询根节点
     * 自己的根节点等于自身,则为根节点
     */
    private int getRoot(int p){
        while (ids[p] != p){
            //将p的根设置为p的爷爷 从而实现路径压缩,访问节点减少为原来的一半
            ids[p] = ids[ids[p]];
            //用爷爷去寻找真正的根
            p = ids[p];
        }
        return p;
    }

    /**
     * 查询是否联通
     * 根节点相同则为联通
     */
    @Override
    public Boolean isConnect(int p, int q){
        return getRoot(p) == getRoot(q);
    }

    /**
     * 连通两个节点
     * @param p
     * @param q
     */
    @Override
    public void connect(int p, int q){
        //获得p的根
        int pid = ids[p];
        int qid = ids[q];
        if (pid == qid) return;

        //sz[pid] 表示p所在树的高度
        if (sz[pid] < sz[qid]){
            /**
             * 小树合并到大树
             */
            //将pid的根换成qid
            ids[pid] = qid;
            //维护以qid为根的树高
            sz[qid] += sz[pid];
        }else{
            ids[qid] = pid;
            sz[pid] += sz[qid];
        }

    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值