天天看點

java資料結構之并查集

希望大家通過本次的學習後,

能夠加深對數組的了解和使用

import java.util.Random;

public class UnionFind {

    public static int count = 0 ;

    private int[] parent ;

    private int[] rank ;

    public UnionFind(int size) {

        parent = new int[size] ;

        rank = new int[size] ;

        for(int i = 0 ;i  < parent.length ; i ++) {

            parent[i] = i ;

            rank[i] = 1 ;

        }

    }

    public int find(int p) {

        while(p != parent[p]) {

            parent[p] = parent[parent[p]] ;

            p = parent[p] ;            

        }

        return p ;

    }

    public int getSize() {

        return parent.length  ;

    }

    public boolean isConnected(int p , int q) {

        return find(p) == find(q) ;

    }

    public void unionElements(int p , int q) {

        //在查找時進行的路徑壓縮

        int pRoot = find(p) ;

        int qRoot = find(q) ;

        if(rank[pRoot] > rank[qRoot]) {

            parent[qRoot] = pRoot ;

        }else if(rank[pRoot] < rank[qRoot]) {

            parent[pRoot] = qRoot ;

        }else {

            parent[pRoot] = qRoot ;

            rank[qRoot] += 1 ;

        }

    }

    private static double testUF(UnionFind uf , int m ) {

        int size = uf.getSize() ;

        Random random = new Random() ;

        long startTime  = System.nanoTime() ;

        for(int i = 0 ; i < m ; i ++) {

            int a = random.nextInt(size) ;

            int b = random.nextInt(size) ;

            uf.unionElements(a , b) ;

        }

        for(int i = 0 ; i < m ;i ++) {

            int a = random.nextInt(size) ;

            int b = random.nextInt(size) ;

            if(uf.isConnected(a, b) ) {

                count ++ ;

            }

        }

        System.out.println("連接配接次數:" + count);

        long endTime = System.nanoTime() ;

        return (endTime - startTime) / 1000000000.0 ;

    }

    public static void main(String[] args) {

        int size = 100000 ;

        int m = 1000000 ;

        UnionFind uf = new UnionFind(size) ;

        System.out.println("UnionFind : " + testUF(uf , m) + "s");

     }

}

java資料結構之并查集