Skip to content

feature: CardinalityInRange#513

Open
DhruvilK7 wants to merge 1 commit intoRoaringBitmap:masterfrom
DhruvilK7:rankrange
Open

feature: CardinalityInRange#513
DhruvilK7 wants to merge 1 commit intoRoaringBitmap:masterfrom
DhruvilK7:rankrange

Conversation

@DhruvilK7
Copy link
Contributor

@DhruvilK7 DhruvilK7 commented Feb 15, 2026

Counting set bits in [start, end) via Rank(end-1) - Rank(start-1) scans all containers from the beginning, taking O(end) time. This is unnecessarily slow for narrow queries on large bitmaps.

Added CardinalityInRange(start, end uint64) uint64, which uses binary search to locate only overlapping containers. This reduces time complexity to O(log end + k) (where k is the number of spanned containers).

Added benchmarks demonstrating significant speedups for narrow ranges, plus comprehensive tests verifying equivalence with the Rank-based approach across all edge cases.

Benchmark results:

name                                                       Rank(end-1)-Rank(start-1)      CardinalityInRange   delta
BenchmarkCardinalityInRange/containers=10/rangeSpan=1-11                46.04 ns/op          14.4 ns/op       -68.72%
BenchmarkCardinalityInRange/containers=10/rangeSpan=10-11               30.64 ns/op         30.58 ns/op        -0.20%
BenchmarkCardinalityInRange/containers=100/rangeSpan=1-11               207.2 ns/op         14.67 ns/op       -92.92%
BenchmarkCardinalityInRange/containers=100/rangeSpan=10-11              205.9 ns/op         47.42 ns/op       -76.97%
BenchmarkCardinalityInRange/containers=100/rangeSpan=100-11             182.1 ns/op         159.2 ns/op       -12.58%
BenchmarkCardinalityInRange/containers=1000/rangeSpan=1-11               1633 ns/op         16.37 ns/op       -99.00%
BenchmarkCardinalityInRange/containers=1000/rangeSpan=10-11              1587 ns/op         54.21 ns/op       -96.58%
BenchmarkCardinalityInRange/containers=1000/rangeSpan=100-11             1591 ns/op         180.6 ns/op       -88.65%
BenchmarkCardinalityInRange/containers=1000/rangeSpan=1000-11            1562 ns/op          1364 ns/op       -12.68%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant