Path Compression in Union Find in DSA C# - Time & Space Complexity
We want to understand how fast the "find" operation runs when using path compression in Union Find.
Specifically, how the number of steps changes as the number of elements grows.
Analyze the time complexity of the following code snippet.
int Find(int[] parent, int x) {
if (parent[x] != x) {
parent[x] = Find(parent, parent[x]);
}
return parent[x];
}
This code finds the root of element x and compresses the path by pointing x directly to the root.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls to Find following parent links.
- How many times: At most once per level up the tree until the root is reached.
Initially, the tree can be tall, so Find may take many steps. But path compression flattens the tree over time.
| Input Size (n) | Approx. Operations per Find |
|---|---|
| 10 | About 2-3 steps on average |
| 100 | About 4-5 steps on average |
| 1000 | About 5-6 steps on average |
Pattern observation: The number of steps grows very slowly, almost constant, even as n grows large.
Time Complexity: O(α(n))
This means each Find operation runs in almost constant time, where α(n) is a very slow-growing function.
[X] Wrong: "Find always takes time proportional to the height of the tree, which can be large."
[OK] Correct: Path compression flattens the tree during Find calls, so the height stays very small over time.
Understanding path compression's time complexity shows you how smart tweaks make algorithms very efficient in practice.
"What if we removed path compression? How would the time complexity of Find change?"
Practice
path compression in a Union Find data structure?Solution
Step 1: Understand the role of path compression
Path compression is used during thefindoperation to make future queries faster by making nodes point directly to the root.Step 2: Identify the effect on the tree structure
This flattens the tree, reducing the height and speeding up subsequentfindcalls.Final Answer:
To speed up thefindoperation by flattening the tree -> Option AQuick Check:
Path compression = flatten tree = faster find [OK]
- Thinking path compression merges sets
- Confusing path compression with union by rank
- Believing it deletes elements
find method with path compression in C#?Solution
Step 1: Check for path compression in the code
int Find(int x) { if (parent[x] != x) parent[x] = Find(parent[x]); return parent[x]; } updatesparent[x]to the root during recursion, which is path compression.Step 2: Verify other options
int Find(int x) { while (parent[x] != x) x = parent[x]; return x; } uses a loop but does not update parents. int Find(int x) { return parent[x]; } returns parent directly without recursion. int Find(int x) { if (parent[x] == x) return x; else return Find(x); } causes infinite recursion.Final Answer:
int Find(int x) { if (parent[x] != x) parent[x] = Find(parent[x]); return parent[x]; } -> Option CQuick Check:
Path compression updates parent during find [OK]
- Using loop without updating parents
- Returning parent without recursion
- Infinite recursion by calling Find(x) instead of Find(parent[x])
uf.Find(3)?
var uf = new UnionFind(5); uf.Union(1, 2); uf.Union(2, 3); Console.WriteLine(uf.Find(3));Assume
Union merges sets by attaching root of second to first and Find uses path compression.Solution
Step 1: Trace the unions
Union(1,2) makes 1 the root of 2. Union(2,3) attaches 3 under 2, so root of 3 is 1 through 2.Step 2: Find root of 3 with path compression
Find(3) follows parent chain 3 -> 2 -> 1, returns 1 and compresses path so 3 points directly to 1.Final Answer:
1 -> Option BQuick Check:
Root after unions = 1 [OK]
- Assuming root is 3 or 2 without tracing
- Ignoring path compression effect
- Confusing union direction
Find method implementation with path compression:
int Find(int x) {
if (parent[x] == x) return x;
else return Find(x);
}Solution
Step 1: Analyze the recursive call
The method callsFind(x)again without changing x, causing infinite recursion.Step 2: Correct recursive call for path compression
It should callFind(parent[x])to move up the tree and compress paths.Final Answer:
It causes infinite recursion because it calls Find(x) instead of Find(parent[x]) -> Option DQuick Check:
Recursive call must use parent[x] [OK]
- Calling Find(x) again causes infinite loop
- Forgetting to update parent for compression
- Using loop but missing path compression
uf.Union(0, 1); uf.Union(1, 2); uf.Union(3, 4); uf.Union(4, 5); uf.Find(2); uf.Find(5); uf.Union(2, 5); uf.Find(5);How many elements will directly point to the root of their set after all operations with path compression?
Solution
Step 1: Track unions and finds
Unions create two sets: {0,1,2} and {3,4,5}. Finds on 2 and 5 compress paths so 0 and 3 become roots with direct children.Step 2: After union(2,5) and find(5), all nodes in one set with path compression
After union(2,5), sets merge. Find(5) compresses path so nodes 2 and 5 point directly to root. Nodes 0 and 1 also point to root from earlier compression.Step 3: Count elements directly pointing to root
Elements 0,1,2,3,4,5 all point directly to the root after the final find(5) call due to path compression.Final Answer:
6 -> Option AQuick Check:
All nodes point directly to root after final find call [OK]
- Assuming all nodes point directly after union
- Ignoring path compression effect only on find calls
- Counting nodes without tracing parent updates
Ready to prove it?
Pass the test and this pattern moves unknown
