1 package net.mograsim.logic.model.verilog.helper;
3 import java.util.HashMap;
6 public class UnionFind<E>
8 private final Map<E, UnionFindElement<E>> elements;
12 this.elements = new HashMap<>();
15 public UnionFindElement<E> getElement(E e)
17 return elements.computeIfAbsent(e, UnionFindElement::new);
22 return find(getElement(e)).getE();
25 public static <E> UnionFindElement<E> find(UnionFindElement<E> elem)
27 if (elem == elem.parent)
29 return elem.parent = find(elem.parent);
32 public E union(E e1, E e2)
34 return union(getElement(e1), getElement(e2)).getE();
37 public static <E> UnionFindElement<E> union(UnionFindElement<E> e1, UnionFindElement<E> e2)
39 UnionFindElement<E> e1Root = find(e1);
40 UnionFindElement<E> e2Root = find(e2);
45 if (e1Root.rank < e2Root.rank)
46 return e1Root.parent = e2Root;
47 else if (e1Root.rank > e2Root.rank)
48 return e2Root.parent = e1Root;
52 return e1Root.parent = e2Root;
56 public static class UnionFindElement<E>
59 private UnionFindElement<E> parent;
62 private UnionFindElement(E e)