Code
package sed.algorithm.chapter1.section5;
public class PathCompressWeightedQuickUnionUF {
private int[] id;
private int[] sz;
private int count;
public PathCompressWeightedQuickUnionUF(int max) {
id = new int[max];
sz = new int[max];
for (int i = 0; i < id.length; i++) {
id[i]=i;
}
for (int i = 0; i < id.length; i++) {
sz[i]=1;
}
count = max;
}
public int count(){
return count;
}
public int find(int p){
int pParent = p;
while(id[pParent]!=pParent){
pParent=id[pParent];
}
while(id[p]!= p){
p=id[p];
id[p]=pParent;
}
return pParent;
}
public boolean connected(int p, int q){
return find(p)== find(q);
}
public void union(int p, int q){
int pRoot = find(p);
int qRoot = find(q);
if (pRoot!=qRoot) {
if (sz[pRoot] < sz[qRoot]) {
id[pRoot] = qRoot;
sz[qRoot] += sz[pRoot];
}else {
id[qRoot] = pRoot;
sz[pRoot] += sz[qRoot];
}
count--;
}
}
}
100 million points , 200million links
Notes:
速度不是一般的快,之前用quick union 算法 跑了一个多小时。。。
(其实我也不想的,因为测试代码里面类引用错了,一直以为用的是这个算法,其实用的是最简单的quick union)。TT 改了以后还没要一分钟。