2013-06-18 3 views
1

Я ищу лучший способ извлечения объектов из большой коллекции на основе их положения от два отсортированных параметров.Как найти ряд объектов в контейнерах на основе нескольких параметров

Пример:

struct Object{ 
    Time start; 
    Time end; 
    //... data 
}; 

Теперь для любого времени t я хочу быстро найти все объекты, которые «существуют» в течение этого времени, т.е. t находится между start и end значениями Объектами.

Подход, который я думал, это использовать:

std::multimap<Time, object*> objectsOrderedByStart; 
std::multimap<Time, object*> objectsOrderedByEnd; 

(multimap, поскольку может быть много объектов с одинаковыми Time значениями, которые являются упорядоченные ключи)

Каждый раз, когда я создать Object Я добавляю его каждому multimap, который автоматически помещает объект в отсортированный список для start и end.

я тогда «запрос» для моих действительных объектов для времени t путем поиска всех объектов в objectsOrderedByStart, где t>Time и объектов в objectsOrderedByEnd где t<End, а затем принимать только те, которые находятся в обоих наборах результатов. Но это кажется неэффективным, и единственная техника, которую я могу найти, чтобы найти объединение, - это один из одного набора результатов и посмотреть, находится ли этот объект в другом результирующем наборе.

Однако я подозреваю, что это не самый эффективный метод. Я мог бы итерации, пропуская элементы при повторении каждого multimap, а не поочередной итерации, а затем отступить, если я зашел слишком далеко и повторю один за другим с последней точки прохода. В качестве альтернативы я мог сохранить только один multimap, а затем заглянуть внутрь каждого object, чтобы посмотреть на его end раз.

Но я подозреваю, что есть лучший способ организовать эти данные и найти тех, кто интересует меня?

+0

@ n.m. Мне любопытно, как вы нашли этот другой вопрос? это не один из «связанных» вопросов, которые появляются, и поиск не изменил это для меня. Конечно, этот вопрос не является C++ специфическим или не помечен как таковой, поэтому, возможно, часть проблемы. – johnbakers

+0

Это хорошо известная проблема, и соответствующий поиск в Google (* поиск по временному интервалу *, я думаю) приводит к тому, что другой вопрос довольно высок в результатах. –

+0

@ н.м. до сих пор метод, которым я больше всего мог обернуть голову, - это расширенное дерево интервала. http://en.wikipedia.org/wiki/Interval_tree – johnbakers

ответ

0

Вы можете использовать два вручную отсортированных массива вместо двух мультиплексоров, а затем использовать std::lower_bound и std::upper_bound или ручной двоичный поиск вручную для поиска в них.

+0

Я думаю, что пользовательский bsp - это путь, в частности, расширенный интервал Дерево кажется хорошим выбором здесь – johnbakers

Смежные вопросы