У меня есть набор из uint32
целых чисел, в комплекте могут быть миллионы элементов. 50-70% из них последовательны, но во входном потоке они появляются в непредсказуемом порядке.Структура данных для построения и поиска набора целых диапазонов
мне нужно:
Сжать этот набор в диапазоны для достижения пространства эффективного представления. Уже реализовано это с использованием тривиального алгоритма, поскольку диапазоны, рассчитанные только один раз, не важны здесь. После этого числа преобразований результирующих диапазонов обычно составляют 5 000-10 000, многие из них, конечно, являются отдельными предметами.
Тестовый членство в некотором целочисленном значении, информация об определенном диапазоне в наборе не требуется. Это должно быть очень быстро - O (1). Думал о minimal perfect hash functions, но они не хорошо играют с диапазонами. Bitsets очень неэффективны. Другие структуры, такие как двоичные деревья, имеют сложность O (log n), худшее с ними, что реализация делает много условных переходов, и процессор не может предсказать их, давая плохую производительность.
Есть ли какая-либо структура данных или алгоритм, специализированные в целых диапазонах для решения этой задачи?
Можете ли вы быть более конкретным о том, какие операции вам нужны? Из того, что я прочитал, у вас есть уже существующий набор диапазонов, и из них вы хотите поддержать операцию «какой диапазон, если таковой имеется, содержит заданное целое число?» Это верно? – templatetypedef
@templatetypedef: Мне нужно просто ответить «да/нет» на «это число в наборе?» для существующего набора. Главный вопрос - как это сделать в O (1) с практическими требованиями к пространству. – actual
Другая мысль - вы считали, что используете что-то вроде бинарной диаграммы решений? Я помню, что Дон Кнут однажды говорил об использовании нулевых подавленных двоичных диаграмм решений для функций кодирования, которые в основном ноль (в вашем случае у вас есть функция от 32 бит к тому, присутствует ли число, и большую часть времени это не). Это даст вам время поиска O (1) (так как каждый поиск занимает не более 32 шагов), хотя я не уверен, насколько это экономично. – templatetypedef