data_structure algorithm adt union_find disjoint_set path_compression union_by_rank union_by_size forest equivalence_relation