Хорошо, я вижу, куда вы идете с этим.
Lucene делает это с очень большими битовыми полями.
Допустим, ваш возможный диапазон чисел варьируется от 1 до 64, каждое из этих чисел соответствует биту в этой позиции в 64-битном int. (№ 1 - это бит 0, № 2 - это бит 1).
Если вы добавите число в диапазон, вы включите этот бит (в вашем примере вы включите биты с 0 по 4 и с 19 по 29).
Теперь, чтобы проверить диапазон чисел, вы создаете еще одно 64-битное целое число с включенным диапазоном битов и выполняете побитовое И (&) для двух битовых полей. 1 бит в результате - это перекрывающийся диапазон.
Если число больше 64, просто увеличьте количество бит (возможно, работая с массивами или списками целых чисел)
Надеюсь, это поможет:)
Обновление : Масштабируемость
Допустим, вы работаете над 64-битной архитектурой, и вы можете И 64-битные целые числа за одну операцию. В идеале вы должны использовать 64-битные целые числа.
Теперь допустим, что ваш возможный диапазон чисел составляет от 1 до 64 000, для этого вам нужно 1000 64-битных целых.
Теперь давайте рассмотрим пару вариантов использования
Я хочу проверить диапазон 70 - 80.
Для этого нам не нужны еще 1000 int для проверки, только одно int, и мы знаем, что проверяем его по второму элементу в нашем массиве.
Я хочу проверить диапазон 2000 - 10000
Опять же, нам нужно только одно целое, вычислить его позицию в массиве 31-го (я думаю) и соответственно установить биты и сравнить. Затем вы перебираете список, пока не достигнете 10000 (позиция 156?), Сравниваясь по пути и создавая список целых чисел, которые нужно вернуть.
Обновление 2 : Это не O (1)
В зависимости от размера проверяемого диапазона, вы можете реализовать это как O (1)
Однако при использовании этого алгоритма общий случай все еще O (n)