Алгоритмы запроса диапазона для потоков целых чисел

Я получаю поток положительных целых чисел в свою программу. Я должен хранить их по мере их получения и иметь возможность отвечать на запросы диапазона, которые возникают между ними.

Простое решение, которое пришло мне в голову, состоит в том, чтобы хранить целые числа в хеш-таблице, где ключи представляют собой символьные представления целых чисел (ключи должны быть строками в моей хеш-таблице). Затем всякий раз, когда приходит запрос диапазона [a, b], я могу просто перейти от a к b, проверить, существует ли ключ, и получить значение, если оно существует. Однако я не уверен, что это хороший подход.

Какие другие альтернативные решения существуют для этой проблемы?


person SpiderRico    schedule 18.06.2018    source источник
comment
Я уверен, что это не очень хороший подход.   -  person Scott Hunter    schedule 18.06.2018
comment
@ScottHunter Да, но по сравнению с чем?   -  person SpiderRico    schedule 18.06.2018
comment
@SpiderRico знаем ли мы ограничения на потоки целых чисел, например, каково максимальное целочисленное значение, которое будет присутствовать в потоке, что-то в этом роде?   -  person zenwraight    schedule 18.06.2018
comment
@zenwraight Нет, мы не знаем максимальное/минимальное значение. Однако мы знаем, что они положительные. Я обновлю вопрос, чтобы отметить этот факт.   -  person SpiderRico    schedule 18.06.2018


Ответы (1)


Если вы сохранили упорядоченный список целых чисел из прочитанного до сих пор потока, то запрос диапазона можно выполнить, найдя a (используя бинарный поиск) и повторяя от этой точки до тех пор, пока вы не пройдете b, так что время, затрачиваемое на запрос, будет быть пропорциональны фактическому размеру результата, независимо от того, насколько разреженным заполнен диапазон.

person Scott Hunter    schedule 18.06.2018
comment
Это действительная альтернатива, и я попробую ее, но можем ли мы сказать, что она строго лучше, чем мое наивное решение? У этого есть время вставки, верно? - person SpiderRico; 18.06.2018
comment
Вам понадобится довольно надуманная или тривиальная проблема, чтобы это не было лучше. - person Scott Hunter; 18.06.2018
comment
@SpiderRico, как насчет использования сбалансированного дерева поиска, такого как дерево AVL, где время вставки будет log(n) ? - person zenwraight; 18.06.2018