加权快速联合算法将如何实现?

问题描述

我目前正在参加普林斯顿算法课程(第1部分),它讨论了通过维护一个额外的数组sz [i]来计算以i为根的树中的对象数量,对快速联合算法的改进,但是它没有显示该怎么做。

应该在哪里以及如何实施该计数器?我曾尝试在root方法中执行此操作,但我意识到它不会计算给定对象的子代。

这是课程中未更改的代码

public class QuickUnionUF {
    private int[] id;
    public QuickUnionUF(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];
        return i;
    }
    public boolean connected(int p,int q) {
        return root(p) == root(q);
    }
    public void union(int p,int q) {
        int i = root(p);
        int j = root(q);
        id[i] = j;
    }
}

解决方法

要执行加权联合,您需要了解每棵树的权重,因此请创建并行数组wt[],其中wt[k]包含根为k的树的大小。初始重量为1。

将较小的树粘合到较大的树的根并更新权重

public void union(int p,int q) {
    int i = root(p);
    int j = root(q);
    if wt[i] < wt[j] { 
        id[i] = j;
        wt[j] += wt[i] 
    }
    else {similar for j->i}
}

初始化

public class QuickUnionUF {
  private int[] id;
  private int[] wt;
  public QuickUnionUF(int N) {
    id = new int[N];
    wt = new int[N];
    for (int i = 0; i < N; i++) {
       id[i] = i;
       wt[i] = 1;
    }
  }