并查集
包含 并
和 查
两方面
- 给节点找到权值最大的BOSS,合并
- 查找该节点的时候,找到该节点的BOSS,进行比较,操作
class UnionFind{
constructor(n){
this.node = new Array(n)
.fill().map((item, idx) => idx)
// 树的高度,代表了节点的权重
this.rank = new Array(n).fill(0);
}
// 查找当前元素所在的根节点
find(x){
if(x === this.node[x]) {
return x;
}
return this.find(this.node[x]);
}
// 合并x,y所处集合
Unite(x, y){
x = this.find(x);
y = this.find(y);
if (x === y) {
return;
}
if (this.rank[x] < this.rank[y]){
node[x] = y;
} else {
if (this.rank[x] === this.rank[y]) {
this.rank[x]++;
}
node[y] = x;
}
}
// 判断两个节点是否为同一集合
same(x, y) {
return this.find(x) === this.find(y);
}
}
参考链接:
[1]:数据结构 – 并查集