![]() |
|
|
![]()
|
|
| Liner |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 28.1.2005 Репутация: нет Всего: нет |
Есть точки на плоскости и число R, задавемое пользователем. Нужно объединить точки, которые ближе друг к другу, чем R, в группы.
Проще по рисунку: (если он не работает, то ссылка на рисунок) ![]() Напрямую ясно как*, но очень медленно. Есть ли хитрые быстрые способы? Спасибо. *Я делаю примерно так: 1. сначала столько же групп, сколько точек, в каждой по одной точке; 2. взять очередную группу, проверить "пересекается" ли она с какой-нибудь другой, если да, объеденить их; 3. повторять 2. до последней группы. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Влоб - построить матрицу расстояний (читай - связности) и разделить ее на подгруппы. Ведь если задано R, то расстояние <2R. O(N^2).
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Liner |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 28.1.2005 Репутация: нет Всего: нет |
Т.е. быстрее N^2 нельзя? На десятках тысяч точек притормаживает
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Можно попробовать построить алгоритм на основе сканирующей линии:
начало как у тебя (каждая точка = кластер), отсортировать точки по x. Потом заводим сканирующую линию = вертикальная полоса: левая граница проходит через самую левую точку, правая - на расстоянии R. Активными считаются кластеры, пересекающие полосу. На каждом шаге проверяем (сравниваем, объединяем) только активные кластеры. Потом переносим линию на следующую точку, обновляем список активных кластеров и снова проверяем. Если R по сравнению с размером области невелико, ИМХО должно помочь. Операция проверки кластеров на "близость" все же вызывает сомнения. Можно попробовать сначала построить граф из точек, где дуга создается, если точки ближе, чем R. Это тоже сканирующей линией. А потом - найти связные компоненты. Естественно, граф строить реально не надо, нам ведь нужны только пары близких точек, которые сразу после обнаружения можно подавать на вход алгоритма поиска связности. Задача связности шикарно описана у Седжвика (Фундаментальные алгоритмы) в первой главе. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |