2014-05-07 3 views
4

У меня есть некоторые объекты с атрибутами x и y (позиции). Я хотел бы получить и обработать те объекты, которые находятся рядом со мной (!), Но игнорировать те, которые находятся вне диапазона (*).Выбор подмножества из большего 2d набора?

__________________________ 
| __________    | 
| |  ! | *   | 
|* |   !|  *  | -me = center of subset 
| | me |   | -! = elements of subset 
| | !  |   | -* = elements of full set, not visible 
| |_______!__| *  *| 
|__________________________| 

Медленный подход будет перебирать полностью, несортированный, набор, и игнорировать элементы, для которых расстояние слишком большое. Однако я собираюсь иметь большой набор данных и нуждаюсь в довольно высокой производительности.

Вместо этого я ищу способ выбора только близлежащих элементов для начала. Может быть, путем сортировки 2d набора в некотором роде и только повторить набор по определенному диапазону (от границы подмножества до границы).

Есть ли хороший способ сделать это?

(примечание: положения объектов, статичны, и набор может быть предварительно обработаны)

+0

Являются ли X и Y широкими и длинными? – Haney

ответ

4

Построить quadtree, содержащий все точки.

В данном прямоугольнике запросов R и корневой узел Q дерева квадратов псевдокод для алгоритма запроса выглядит следующим образом.

query(Rectangle R, QuadTreeNode Q) 
    if R and Q.bounds are disjoint 
     yield no points 
    else if R contains Q.bounds 
     yield all points in the subtree of Q 
    else (if R intersects Q.bounds) 
     yield all points in query(R, Q.child[i]) for i = 0, 1, 2, 3 

Это предполагает QuadTreeNode имеет Rectangle bounds и QuadTreeNode child[4].

+3

+1 Узнал что-то новое сегодня. –

+0

Отлично! Не знал об этом, но теперь я его реализовал. Я добился увеличения производительности на 40-70% в зависимости от итерации. – user717572

+0

@ user717572 Приятно слышать. :) Оптимизированная реализация может часто давать вам прибыль намного больше, чем даже это (в зависимости от того, насколько велика ваша точка набора). Другое дело, что область запроса 'R' необязательно должна быть прямоугольником. Тот же самый точный алгоритм будет работать и для других форм запроса - например, для круга. –

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