Задать вопрос

Быстрый алгоритм поиска

Есть большой массив объектов. Объект имеет несколько атрибутов. Атрибут может принимать булевое значение или число (как целове так и вещественное).
Пример:

Объект 1:
атрибут 1: true
атрибут 2: 2
атрибут 3: 22.43

Объект 2:
атрибут 1: false
атрибут 2: 5
атрибут 3: 10.7

и тд.

Как максимально быстро реализовать возможность поиска по атрибутам в таком массиве? Причем можно задавать диапазоны поиска, то есть: покажи мне все объекты у которых атрибут 1: false, атрибут 2: от 1 до 90 и тд.
Задача похожа на запросы к БД. Интересно каким образом там это реализовано.
В голову пришло пока что ток одно: сделать для каждого атрибута бинарные деревья поиска.
  • Вопрос задан
  • 8957 просмотров
Подписаться 6 Оценить 5 комментариев
Ответ пользователя xappymah К ответам на вопрос (7)
xappymah
@xappymah
Как один из вариантов оптимизации поиска: факторизация всех объектов по булевским аттрибутам. То есть объекты делятся на непересекающиеся группы с различными комбинациями булевских параметров.
Имеется массив с количеством элементов, равным количеству групп.
Каждая группа объединяется в список и за голову цепляется за соответствующий элемент массива.

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

Сами списки можно также факторизовать по какому-нибудь часто-используемому атрибуту (потребуется набор индексов, для нахождения соответствующих фактор-групп) или просто отсортировать.

Но все приведенное выше является не более чем оптимизацией поиска. В худшем случае все равно будет линейное время.

(кстати, а чем линейная сложность автора не устраивает?)
Ответ написан