并查集

192 阅读1分钟

并查集:主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:

  • 合并(Union):把两个不相交的集合合并为一个集合。
  • 查询(Find):查询两个元素是否在同一个集合中。

简单实现

下面例子以typescript实现 主要实现四个方法

  • size(): 集合元素个数
  • find(): 查找属于哪个分组
  • isConnect(): 是否属于同一个分组
  • uion:(): 合并两个数据到同一个分组

数组法

class UionFind {
    private list: number[];
    constructor(num: number) {
        this.list = [];
        for (let i = 0; i < num; i++) {
            this.list[i] = i;
        }
    }
    size() : number {
        return this.list.length;
    }

    find(id: number) : number {
        return this.list[id];
    }

    isConnect(a:number,b:number): boolean {
        return this.find(a) === this.find(b);
    }

    uion(a:number,b:number) {
        const aVal = this.list[a];
        const bVal = this.list[b];
        //数组遍历, o(n)时间复杂度
        for (let i = 0; i < this.list.length; i++) {
            if (this.list[i] === aVal) {
                this.list[i] === bVal;
            }
        }
    }
}

因为在合并的时候需要比那里数组,会产生 o(n)时间复杂度

参考 数据结构之并查集 老白:并查集