perf(sorted_set): O(n+m) difference, intersection, symmetric_difference#3315
Open
perf(sorted_set): O(n+m) difference, intersection, symmetric_difference#3315
Conversation
Collaborator
Pull Request Test Coverage Report for Build 3091Details
💛 - Coveralls |
6e62af2 to
281c2bf
Compare
2 tasks
645de7f to
aa3d5e5
Compare
…, symmetric_difference
Replace O(n*log m) implementations that iterate + contains with
split-based divide-and-conquer approach matching immut/sorted_set.
Before: self.each(x => if !src.contains(x) { ret.add(x) })
- O(n * log m) for each operation
After: split_member-based recursive merge
- O(n + m) using the same algorithm as immut/sorted_set
Also removes the TODO comment about symmetric_difference optimization.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
aa3d5e5 to
a6ab4bf
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
Replace O(n*log m) set operations with O(n+m) split-based divide-and-conquer, matching the approach used in
immut/sorted_set.Before
After
For two 100K-element sets, this is approximately 17x faster (O(200K) vs O(100K * 17)).
Changes
split_member— likesplitbut also returns whether the pivot was foundconcat— joins two trees where all left elements < all right elementsremove_min— helper forconcatdifference,intersection,symmetric_differenceusing split-based approachTest plan
🤖 Generated with Claude Code