diff --git a/data_structures/dsu_path_compression.cpp b/data_structures/dsu_path_compression.cpp index 4531a6b81..ca8793674 100644 --- a/data_structures/dsu_path_compression.cpp +++ b/data_structures/dsu_path_compression.cpp @@ -1,22 +1,46 @@ -#include -#include +/** + * @file + * @brief [DSU(Disjoint sets)](https://en.wikipedia.org/wiki/Disjoint-set-data_structure) + * @details + * dsu : It is a very powerful data structure which keeps track of different + * clusters(sets) of elements, these sets are disjoint(doesnot have a common element). + * Disjoint sets uses cases : for finding connected components in a graph, + * used in Kruskal's algorithm for finding Minimum Spanning tree. + * Operations that can be performed: + * 1) UnionSet(i,j): add(element i and j to the set) + * 2) findSet(i): returns the representative of the set to which i belogngs to. + * 3) get_max(i),get_min(i) : returns the maximum and minimum + * Below is the class-based approach which uses the heuristic of path compression. + * Using path compression in findSet(i),we are able to get to the representative of i + * in O(1) time. + * @author [AayushVyasKIIT](https://github.com/AayushVyasKIIT) + * @see dsu_union_rank.cpp + */ + +#include ///for io +#include ///for using vectors using std::cout; using std::endl; using std::vector; -//Disjoint set union -class DSU{ +/** + * @brief Disjoint sets union data structure, class based representation. + * @param n number of elements + */ +class dsu{ private: - // p: keeps track of parent of i - // depth: tracks the depth of i - // setSize: size of each chunk(set) - // maxElement : max of each set, using maxElement[representative] - // minElement : min of each set, using minElement[representative] - vector p,depth,setSize,maxElement,minElement; + vector p; /// depth; /// setSize;/// maxElement;/// minElement;/// maximum number of items - explicit DSU(int n){ + /** + * @brief contructor for initialising all data members. + * @param n number of elements + */ + explicit dsu(int n){ p.assign(n,0); //initially all of them are their own parents. for(int i=0;i root(representative) return (p[i] = findSet(p[i])); } - //union of 2 sets + /** + * @brief Method that combines two disjoint sets to which i and j belongs to + * and make a single set having a common representative. + * @param i element of some set + * @param j element of some set + * @returns void + */ void UnionSet(int i,int j){ //check if both belongs to same set or not if(isSame(i,j)){ @@ -75,37 +109,61 @@ class DSU{ maxElement[y] = std::max(maxElement[x],maxElement[y]); minElement[y] = std::min(minElement[x],minElement[y]); } - //checks if both belongs to same set + /** + * @brief A utility function which check whether i and j belongs to + * same set or not + * @param i element of some set + * @param j element of some set + * @returns `true` if element i and j are in same set + * @returns `false` if element i and j are not in same set + */ bool isSame(int i,int j){ if(findSet(i) == findSet(j)){ return true; } return false; } - //returns min max size of i's set + /** + * @brief prints the minimum, maximum and size of the set to which i belongs to + * @param i element of some set + * @returns void + */ void get(int i){ cout << "min:" << get_min(i) << " max:" << get_max(i) << " size of set:" < -#include +/** + * @file + * @brief [dsu(Disjoint sets)](https://en.wikipedia.org/wiki/Disjoint-set-data_structure) + * @details + * dsu : It is a very powerful data structure which keeps track of different + * clusters(sets) of elements, these sets are disjoint(doesnot have a common element). + * Disjoint sets uses cases : for finding connected components in a graph, + * used in Kruskal's algorithm for finding Minimum Spanning tree. + * Operations that can be performed: + * 1) UnionSet(i,j): add(element i and j to the set) + * 2) findSet(i): returns the representative of the set to which i belogngs to. + * 3) getParents(i): prints the parent of i and so on and so forth. + * Below is the class-based approach which uses the heuristic of union-ranks. + * Using union-rank in findSet(i),we are able to get to the representative of i + * in slightly delayed O(logN) time but it allows us to keep tracks of the parent of i. + * @author [AayushVyasKIIT](https://github.com/AayushVyasKIIT) + * @see dsu_path_compression.cpp + */ + +#include ///for io +#include ///for using vectors using std::cout; using std::endl; using std::vector; -class DSU{ +/** + * @brief Disjoint sets union data structure, class based representation. + * @param n number of elements + */ +class dsu{ private: - // p: keeps track of parent of i - // depth: tracks the depth of i - // setSize: size of each chunk(set) - vector p,depth,setSize; + vector p; /// depth; /// setSize;/// maximum number of items - explicit DSU(int n){ + /** + * @brief constructor for initialising all data members + * @param n number of elements + */ + explicit dsu(int n){ p.assign(n,0); //initially all of them their own parents depth.assign(n,0); @@ -25,14 +50,25 @@ class DSU{ setSize[i] = 1; } } + /** + * @brief Method to find the representative of the set to which i belongs to, T(n) = O(logN) + * @param i element of some set + * @returns representative of the set to which i belongs to + */ int findSet(int i){ - //union rank i - > p[i] + /// using union-rank while(i!=p[i]){ i = p[i]; } return i; } - //union of 2 sets + /** + * @brief Method that combines two disjoint sets to which i and j belongs to and make + * a single set having a common representative. + * @param i element of some set + * @param j element of some set + * @returns void + */ void unionSet(int i,int j){ //check if both belongs to same set or not if(isSame(i,j)){ @@ -57,13 +93,24 @@ class DSU{ //total size of the resultant set setSize[y]+=setSize[x]; } - // checks if both belongs to same set + /** + * @brief A utility function which check whether i and j belongs to same set or not + * @param i element of some set + * @param j element of some set + * @returns `true` if element i and j are in same set + * @returns `false` if element i and j are not in same set + */ bool isSame(int i,int j){ if(findSet(i) == findSet(j)){ return true; } return false; } + /** + * @brief Method to print all the parents of i, or the path from i to representative. + * @param i element of some set + * @returns void + */ void getParents(int i){ while(p[i]!=i){ cout << i << " ->"; @@ -74,10 +121,13 @@ class DSU{ }; +/** + * @brief Main function + * @returns 0 on exit + */ int main(){ - int n = 10; - //n: number of items - DSU d(n+1); + int n = 10; ///