@SergeySerge11

Какой самый быстрый алгоритм поиска в массиве непересекающихся отрезков, поиск отрезка внутри которого лежит точка?

У меня есть решение бинарного поиска. Оно O(ln(n) ), а есть ли решение для O(1) за одну операцию, из доп условия?
Условие.
1. Весь отрезок заполнен отрезками, без свободных мест.( и явл. константной).
2. Есть массив, элементы которого явл. Х0 отрезков. к примеру {0,1,1,2,3,5,8,13,21,34} или {1,2,4,8,16,32,}
3. Сами элементы массива. Уже сортированы, и явл. отображением некоторой функции по возрастанию Длин f(i) = x0i
К примеру из примера 2 . ф-цией f(i)=2^i , но может быть и сложнее, примерно на такое 2^(i/4).
O(1) из задачи может вытекать к примеру для любой линейной последовательности (0,10,20,30,40) тут просто поделить на 10, взять целую часть. index= value/10; А для не линейных отрезков возможно ли придумать запрос.
На вход поступает число, на выход индекс где arr[index]<= var
Да также для длинны пространства для разбития к примеру 1024, можно сделать
switch(n_1024){
case 0:
casse 1:
///....
case 1024:
}
  • Вопрос задан
  • 519 просмотров
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Если нет простой формулы, как в линейном случае (например, логарифм или корень числа), то за О(1) можно только если числа не очень большие: надо предподсчитать ответы для всех возможных индексов.

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

Если запрос только один, то можно не париться, ибо время на загрузку массива с отрезками вы уже потратили и вся программа уже точно O(n) как минимум.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Ваше решение O(ln(n)) - это очень хорошее решение. Пускай оно и будет.

Для других оптимизаций нужно строить дополнительные структуры данных. Например хеш таблица которая режет пространство отрезков на линейную последовательность равных кусков и для каждого куска хранит просто список ваших отрезков. Будет некоторая избыточность зато у вас есть почти O(1) и есть механика плавного регулятора. Тоесть вы можете балансировать сколько вам отдать памяти под хеш таблицу и сделать результат более точным. Или наоборот сэкономить но сделать чуть-чуть O(n). Мне почему-то фантазия подсказывает какие-то золотые сечения и теорему Котельникова ... ну вобщем у вас есть широкое пространство для творчества.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы