Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Группировка точек на пл-ти по близости друг другу, (разбиение на кластеры - 2) 
:(
    Опции темы
Liner
Дата 26.3.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.1.2005

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



Есть точки на плоскости и число R, задавемое пользователем. Нужно объединить точки, которые ближе друг к другу, чем R, в группы.
Проще по рисунку:
(если он не работает, то ссылка на рисунок)
user posted image
Напрямую ясно как*, но очень медленно.
Есть ли хитрые быстрые способы?
Спасибо.

*Я делаю примерно так:
1. сначала столько же групп, сколько точек, в каждой по одной точке;
2. взять очередную группу, проверить "пересекается" ли она с какой-нибудь другой, если да, объеденить их;
3. повторять 2. до последней группы.

PM MAIL   Вверх
Akina
Дата 27.3.2006, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 20
Всего: 454



Влоб - построить матрицу расстояний (читай - связности) и разделить ее на подгруппы. Ведь если задано R, то расстояние <2R. O(N^2).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Liner
Дата 27.3.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.1.2005

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



Т.е. быстрее N^2 нельзя? На десятках тысяч точек притормаживает smile
PM MAIL   Вверх
Earnest
Дата 28.3.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Можно попробовать построить алгоритм на основе сканирующей линии:
начало как у тебя (каждая точка = кластер), отсортировать точки по x. Потом заводим сканирующую линию = вертикальная полоса: левая граница проходит через самую левую точку, правая - на расстоянии R. Активными считаются кластеры, пересекающие полосу.
На каждом шаге проверяем (сравниваем, объединяем) только активные кластеры. Потом переносим линию на следующую точку, обновляем список активных кластеров и снова проверяем. Если R по сравнению с размером области невелико, ИМХО должно помочь.

Операция проверки кластеров на "близость" все же вызывает сомнения. Можно попробовать сначала построить граф из точек, где дуга создается, если точки ближе, чем R. Это тоже сканирующей линией. А потом - найти связные компоненты. Естественно, граф строить реально не надо, нам ведь нужны только пары близких точек, которые сразу после обнаружения можно подавать на вход алгоритма поиска связности. Задача связности шикарно описана у Седжвика (Фундаментальные алгоритмы) в первой главе.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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