Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрый поиск объектов в пространстве, создание 2д/3д индекса... 
:(
    Опции темы
nucer
  Дата 4.11.2012, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 21.6.2004
Где: Москва

Репутация: нет
Всего: 0



Всем привет!

Есть:
2Д(или 3Д) пространство, в котором присутствует некое кол-во объектов с координатами x,y(,z)

Суть задачи:
Каким образом осуществляется такая операция, как, нахождение объектов в радиусе R от точки P?

1)Простейшее решение - это, конечно, перебор всех объектов, проверка расстояния от них до P и выборка соответствующих критериям. Конечно же, такой подход очень неэффективен при большом количестве объектов в большом пространстве. Например, при поиске всех магазинов в радиусе 100 метров от дома №3 по улице Васина по базе данных, содержащей все магазины Москвы... 

2) Мне на ум приходит что то навроде графа [G1], в котором каждый объект имеет связи с несколькими ближайшими.
Имея некий начальный объект мы можем по принципу рекурсии проверять соседние объекты до тех пор, пока расстояние не превысит R.
Чтобы определить начальный объект при задании произвольной точки P можно ввести дополнительные "якоря" - опорные точки, имеющие определённый радиус и список объектов, находящихся от опорной точки не дальше значения радиуса. Для точки P будем находить соответствующий ей якорь, внутри него перебором выбирать ближайший к ней объект.
Чтобы оптимизировать алгоритм при большом размере пространства - можно якоря также хранить в виде иерархического графа [G2], по сути являющимся разметкой области на прямоугольные области, внутри которых также могут быть размечены прямоугольные области (а уже для области имеется список объектов внутри неё).

3) Или же взять последнюю строчку из варианта 2: разметка на квадраты, внутри которых также размечены квадраты (убрать G1, фигачить объекты сразу в G2). По идее этого достаточно для более-менее четкого определения подмножества объектов для поиска?


Правильно ли я мыслю?
Возможно, кто то подскажет примеры реализации (в общем виде описания алгоритмов и/или кодом), чтобы не изобретать велосипед совсем с нуля))

И сразу в продолжение... Задачу можно немного переформулировать так:
Каким образом осуществляется нахождение N ближайших объектов заданного типа к объекту O? Например, на нашей карте есть база данных не только по магазинам, но также и по 195 другим типам объектов, и нам нужно выбрать именно 10 ближайших магазинов...
Рациональнее ли будет держать индекс для каждого типа объектов? Особенно при случае, когда одному объекту может соответствовать несколько типов...
Или же стоит использовать подход варианта 2 и заранее предусматривать связи между объектами, исходя из поставленной задачи (координат, типов и т.п.)?

Это сообщение отредактировал(а) nucer - 4.11.2012, 08:09
PM MAIL   Вверх
maxim1000
Дата 4.11.2012, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



деревья или сетки

деревья: https://en.wikipedia.org/wiki/Kd-tree

сетка - по сути то, что описано в #3 - просто делим пространство на NxMxK ячеек и записываем в кадой ячейке ссылки на объекты, которые полностью или частично в ней находятся, ну и при поиске просто перебираем нужные ячейки вместо всего пространства

деревья не заточены под конкретный радиус, но по ним нужно проходиться

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

Это сообщение отредактировал(а) maxim1000 - 4.11.2012, 13:22


--------------------
qqq
PM WWW   Вверх
baldina
Дата 4.11.2012, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



Цитата(nucer @  4.11.2012,  08:08 Найти цитируемый пост)
Мне на ум приходит что то навроде графа [G1], в котором каждый объект имеет связи с несколькими ближайшими.

мысль неплохая. таким графом является триангуляция Делоне или диаграмма Вороного (это двойственные графы)
трудоемкость построения такого графа - O(NlogN)

Добавлено через 3 минуты и 9 секунд
выбор метода, видимо, должен зависеть от того, как часто добавляются точки в множество и как часто осуществляется поиск. возможно, есть и другие факторы, влияющие на решение, например, если одни точки могут быть центром заведомо чаще, чем другие
PM MAIL   Вверх
nucer
Дата 4.11.2012, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 21.6.2004
Где: Москва

Репутация: нет
Всего: 0



maxim1000, спасибо! R-дерево как раз соответствует разбиению на прямоугольные области (G2). K-мерное дерево - если честно немного вынесло мне мозг, не понял, пока какому принципу там строятся плоскости (а именно, как определяется оптимальный угол наклона плоскости к осям)...

baldina, спасибо огромное, действительно ценная информация!) Как раз триангуляция Делоне это видимо то, что нужно в случае G2.
Сразу забегая вперёд (рабочий код, чтобы понять на 100% пока ещё не написал )) хочу спросить: как к получившемуся в результате триангуляции графу добавить всё те же "якоря", не соображу как это должно выглядеть... Есть мысль, что нужно строить ещё окружности (или может прямоугольные области?), но анализируя не точки, а по окружности, с помощью которых строился сам граф? И так можно аппроксимировать n раз, пока в идеале не сведем к одной окружности, охватывающей все точки? smile На словах звучит логично, но вот реализация пока очень туманна...

В общем всем спасибо, пока буду разбираться, информации предостаточно smile
PM MAIL   Вверх
baldina
Дата 4.11.2012, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



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

Добавлено через 4 минуты и 18 секунд
Цитата(nucer @  4.11.2012,  19:29 Найти цитируемый пост)
 K-мерное дерево - если честно немного вынесло мне мозг, не понял, пока какому принципу там строятся плоскости

это суть тоже разбиение на прямоугольные области. рассмотрите 2d дерево, его просто понять. если обычное дерево поиска сортирует точки по одному критерию (1d), то 2d дерево - по x и y, kd дерево - по k размерностям. k-я размерность соответствует k-му уровню в дереве.
PM MAIL   Вверх
maxim1000
Дата 4.11.2012, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(nucer @  4.11.2012,  19:29 Найти цитируемый пост)
K-мерное дерево - если честно немного вынесло мне мозг, не понял, пока какому принципу там строятся плоскости (а именно, как определяется оптимальный угол наклона плоскости к осям)...

просто перпендикулярно одной из осей


--------------------
qqq
PM WWW   Вверх
baldina
Дата 5.11.2012, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



Цитата(maxim1000 @  4.11.2012,  23:33 Найти цитируемый пост)
просто перпендикулярно одной из осей 

перпендикулярность в пространстве размерности больше 3х моск и выносит smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0696 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.