Bird
Raised Fist0
DSA C++programming~5 mins

Path Compression in Union Find in DSA C++ - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the main purpose of path compression in Union Find?
Path compression helps to speed up the 'find' operation by making nodes on the path point directly to the root, flattening the structure for faster future queries.
Click to reveal answer
beginner
In Union Find, what does the 'find' function do?
The 'find' function returns the representative or root of the set that a particular element belongs to.
Click to reveal answer
intermediate
How does path compression affect the time complexity of Union Find operations?
Path compression reduces the time complexity of 'find' and 'union' operations to nearly O(1) amortized, specifically O(α(n)) where α is the inverse Ackermann function, which grows very slowly.
Click to reveal answer
intermediate
Show the key line of code that performs path compression in the 'find' function.
return parent[node] = find(parent[node]); // This line sets the parent of 'node' directly to the root.
Click to reveal answer
advanced
Why is path compression considered a 'lazy' optimization?
Because it only updates the parent pointers during 'find' calls, not immediately during union operations, making the structure flatter over time as needed.
Click to reveal answer
What does path compression do in the Union Find data structure?
AFlattens the tree by making nodes point directly to the root during find operations
BMerges two sets by size
CDeletes nodes from the set
DCreates new sets for each element
Which function in Union Find is directly improved by path compression?
AUnion
BFind
CInsert
DDelete
What is the typical time complexity of Union Find operations with path compression?
AO(n)
BO(log n)
CO(n^2)
DO(α(n)) (inverse Ackermann function)
In the path compression line 'parent[node] = find(parent[node]);', what does this assignment do?
ASets node's parent to the root of its set
BRemoves node from the set
CSets node's parent to itself
DCreates a new set for node
Why is path compression done only during 'find' and not during 'union'?
ABecause 'union' does not access parents
BBecause 'union' is slower
CTo keep union operation simple and defer flattening until needed
DBecause path compression is unrelated to union
Explain how path compression works in the Union Find data structure and why it improves performance.
Think about what happens to the parent pointers when you call find repeatedly.
You got /4 concepts.
    Describe the difference between the 'union' operation and the 'find' operation in Union Find, especially focusing on where path compression is applied.
    Consider which operation changes the structure and which one optimizes the search.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of path compression in the Union Find data structure?
      easy
      A. To merge two sets by size
      B. To speed up the find operation by making nodes point directly to the root
      C. To initialize the parent array
      D. To count the number of connected components

      Solution

      1. Step 1: Understand the find operation

        The find operation locates the root parent of a node in Union Find.
      2. Step 2: Role of path compression

        Path compression updates nodes along the path to point directly to the root, reducing future search time.
      3. Final Answer:

        To speed up the find operation by making nodes point directly to the root -> Option B
      4. Quick Check:

        Path compression optimizes find = To speed up the find operation by making nodes point directly to the root [OK]
      Hint: Path compression flattens trees to speed up find [OK]
      Common Mistakes:
      • Confusing path compression with union by size/rank
      • Thinking it merges sets instead of optimizing find
      • Assuming it initializes data structures
      2. Which of the following is the correct syntax for the find function with path compression in C++?
      easy
      A. int find(int x) { if(parent[x] != x) parent[x] = find(parent[x]); return parent[x]; }
      B. int find(int x) { while(parent[x] != x) x = parent[x]; return x; }
      C. int find(int x) { return parent[x]; }
      D. int find(int x) { if(parent[x] == x) return x; else return find(parent[x]); }

      Solution

      1. Step 1: Identify path compression usage

        Path compression updates parent[x] during recursion to root.
      2. Step 2: Check each option

        int find(int x) { if(parent[x] != x) parent[x] = find(parent[x]); return parent[x]; } updates parent[x] with recursive call result, implementing path compression correctly.
      3. Final Answer:

        int find(int x) { if(parent[x] != x) parent[x] = find(parent[x]); return parent[x]; } -> Option A
      4. Quick Check:

        Path compression requires assignment in recursion = int find(int x) { if(parent[x] != x) parent[x] = find(parent[x]); return parent[x]; } [OK]
      Hint: Look for recursive assignment to parent[x] in find [OK]
      Common Mistakes:
      • Missing assignment to parent[x] for compression
      • Using iterative find without compression
      • Returning parent[x] without recursion
      3. Consider the following code snippet using Union Find with path compression:
      int parent[5] = {0, 1, 2, 3, 4};
      
      int find(int x) {
        if(parent[x] != x) parent[x] = find(parent[x]);
        return parent[x];
      }
      
      void unionSet(int a, int b) {
        int rootA = find(a);
        int rootB = find(b);
        if(rootA != rootB) parent[rootB] = rootA;
      }
      
      unionSet(1, 2);
      unionSet(2, 3);
      find(3);
      
      What is the state of the parent array after these operations?
      medium
      A. [0, 1, 3, 3, 4]
      B. [0, 1, 2, 2, 4]
      C. [0, 1, 1, 2, 4]
      D. [0, 1, 1, 1, 4]

      Solution

      1. Step 1: Perform unions

        unionSet(1,2): parent[2] = 1; unionSet(2,3): parent[3] = find(2) = 1, so parent[3] = 1.
      2. Step 2: Apply find(3) with path compression

        find(3) updates parent[3] to root 1 (already 1), so no change. parent array: [0,1,1,1,4]
      3. Final Answer:

        [0, 1, 1, 1, 4] -> Option D
      4. Quick Check:

        Parents after unions and compression = [0,1,1,1,4] [OK]
      Hint: Trace unions first, then apply find with compression [OK]
      Common Mistakes:
      • Not updating parent of 3 during union
      • Ignoring path compression effect in find
      • Confusing indices and values in parent array
      4. The following find function is intended to implement path compression but has a bug:
      int find(int x) {
        if(parent[x] == x) return x;
        find(parent[x]);
        return parent[x];
      }
      What is the bug in this code?
      medium
      A. It does not update parent[x] during recursion for compression
      B. It uses == instead of != in the base case
      C. It returns parent[x] instead of x
      D. It causes infinite recursion

      Solution

      1. Step 1: Analyze recursion call

        The recursive call find(parent[x]) is made but its result is not assigned back to parent[x].
      2. Step 2: Effect on path compression

        Without assignment, parent[x] remains unchanged, so path compression does not happen.
      3. Final Answer:

        It does not update parent[x] during recursion for compression -> Option A
      4. Quick Check:

        Missing assignment breaks path compression = It does not update parent[x] during recursion for compression [OK]
      Hint: Always assign recursion result to parent[x] for compression [OK]
      Common Mistakes:
      • Thinking base case condition is wrong
      • Assuming return value is incorrect
      • Believing it causes infinite recursion
      5. You have a Union Find structure with 6 elements (0 to 5). Initially, each element is its own parent. You perform these operations:
      unionSet(0, 1);
      unionSet(1, 2);
      unionSet(3, 4);
      unionSet(4, 5);
      find(2);
      find(5);
      unionSet(2, 5);
      find(5);
      
      After all operations, what is the parent array state assuming path compression is used in find?
      hard
      A. [0, 1, 0, 3, 4, 3]
      B. [0, 0, 0, 3, 3, 3]
      C. [0, 0, 0, 0, 3, 0]
      D. [0, 0, 1, 3, 3, 0]

      Solution

      1. Step 1: Perform initial unions

        unionSet(0,1): parent[1]=0; unionSet(1,2): parent[2]=find(1)=0; unionSet(3,4): parent[4]=3; unionSet(4,5): parent[5]=find(4)=3;
      2. Step 2: Apply finds with path compression

        find(2): compresses path for 2 to 0 (already 0); find(5): compresses path for 5 to 3 (already 3); unionSet(2,5): parent[3]=find(2)=0; find(5): compresses path for 5 to 0, so parent[5]=0;
      3. Step 3: Final parent array

        parent[0]=0, parent[1]=0, parent[2]=0, parent[3]=0 (updated), parent[4]=3, parent[5]=0 (compressed)
      4. Final Answer:

        [0, 0, 0, 0, 3, 0] -> Option C
      5. Quick Check:

        After unions and compression, parent array = [0, 0, 0, 0, 3, 0] [OK]
      Hint: Track unions then compress paths after finds [OK]
      Common Mistakes:
      • Not updating parent of 3 during unionSet(2,5)
      • Ignoring path compression effect on 5 after last find
      • Mixing parent indices and values
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard