fix: added path compression to UnionFind #734
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Main Changes
The current implementation of the union find data structure claims its amortized time complexity is$O(\alpha(n))$ , which is incorrect because its
Find
method has no optimization. I added path compression as the necessary optimization. Path splitting and path halving are also valid optimizations, but I think path compression is the most common one.I changed union-by-size to union-by-rank, which complements path compression effectively.
In addition, I changed the receivers of
Find
andUnion
to pointers. Along with this, I removed the unnecessary return value inUnion
.Other Changes
I fixed a small typo in the algorithm description and used more consistent variable names.
graph/kruskal.go
usesUnionFind
, so I also modified that file to conform to the updatedUnion
method.