Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Помогите с алгоритмом...

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Mystique



Зарегистрирован: 10.11.2002
Сообщения: 6
Откуда: Moscow

СообщениеДобавлено: Вс Ноя 10 2002 11:26    Заголовок сообщения: Помогите с алгоритмом... Ответить с цитатой

Нужен алгоритм, разбивающий кучу прямоугольников на группы пересекающихся областей. Т.е. например, если пересекаются прямоугольники с номерами 1,2,3 в одной группе(например пересекаются 1 и 2, 2 и 3) и 4,5 в другой группе, то выходом должен быть список:
1,2,3
4,5
Простой перебор и сравнение каждого с каждым не проходит (слишком долго). Подскажите пожалуйста идейку алгоритма, работающего по шустрее...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
JekLove



Зарегистрирован: 22.02.2002
Сообщения: 41
Откуда: Новосибирск

СообщениеДобавлено: Вс Ноя 10 2002 13:23    Заголовок сообщения: Проверок "каждого с каждым" можно избежать, если Ответить с цитатой

сначала отсортировать список прямоугольников по x- или y-координате. Число проверок значительно уменьшится (в общем случае).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Chea
Гость





СообщениеДобавлено: Пн Ноя 11 2002 03:43    Заголовок сообщения: Еще вариант Ответить с цитатой

Для найденной группы создай прямоугольник содержащий всю группу и проверяй его. Если с ним нет пересечения то нет пересечения и с прямоугольниками группы
Вернуться к началу
Mystique



Зарегистрирован: 10.11.2002
Сообщения: 6
Откуда: Moscow

СообщениеДобавлено: Пн Ноя 11 2002 11:17    Заголовок сообщения: Re: Проверок "каждого с каждым" можно избежать, если Ответить с цитатой

Очень часто попадаются варианты, когда одна группа наползает на другую по Х и по У, но на самом деле они не пересекаются (пример: две группы, расположенные под 45 градусов к горизонту, идущие более-менее параллельно друг к другу). Опознаются, как одна группа.
Что бы тут можно еще придумать? Чувствую, что можно как-то приспособиться с сортировкой, но как-то хитрее...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mystique



Зарегистрирован: 10.11.2002
Сообщения: 6
Откуда: Moscow

СообщениеДобавлено: Пн Ноя 11 2002 11:20    Заголовок сообщения: Re: Еще вариант Ответить с цитатой

Попробовал. Действительно стало шустрее. Спасибо. Но, к сожалению, не намного, т.к. исходные данные в большинстве ситуаций идут большим количеством групп, каждая из которых состоит из 3-5 областей. Так что ускорилось где-то в те самые раза 3. К сожалению, надо еще шустрее... Посоветуйте еще что-нибудь, если не сложно... Заранее большое спасибо!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Борис
Гость





СообщениеДобавлено: Пн Ноя 11 2002 13:16    Заголовок сообщения: Тут нужны триангуляционные алгоритмы. В предельном случае скорость N*log(N). Это тоже достаточно долго, хотя не сравнить с твои Ответить с цитатой

-
Вернуться к началу
Mystique



Зарегистрирован: 10.11.2002
Сообщения: 6
Откуда: Moscow

СообщениеДобавлено: Пн Ноя 11 2002 18:49    Заголовок сообщения: Re: Тут нужны триангуляционные алгоритмы. В предельном случае скорость N*log(N). Это тоже достаточно долго, хотя не сравнить с Ответить с цитатой

Дык, мне бы и идейки хватило бы... Ну не представляю я, как можно сделать еще шустрее... Именно к классу сложности N*logN я и стремлюсь...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Борис
Гость





СообщениеДобавлено: Пн Ноя 11 2002 19:17    Заголовок сообщения: Копай триангуляцию (-) Ответить с цитатой

-
Вернуться к началу
Chea
Гость





СообщениеДобавлено: Пн Ноя 11 2002 19:53    Заголовок сообщения: Вариант 2 Ответить с цитатой

В общих чертах идея следующая
1 Сортируем по горизонтали
2 Проверяем последовательно N и N+1 если не пересекаются то и предыдущие не пересекаются следовательно группы разные. Таким образом выделяем подгруппы.
3 Каждую подгруппу сортируем по вертикали
4 Проверяем последовательно в каждой подгруппе M и M+1 Получаем группы.

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



Зарегистрирован: 10.11.2002
Сообщения: 6
Откуда: Moscow

СообщениеДобавлено: Чт Ноя 14 2002 11:12    Заголовок сообщения: Re: Копай триангуляцию (-) Ответить с цитатой

Сорри, а что это? Если не трудно, можно чуть подробне? Заранее спасибо!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mystique



Зарегистрирован: 10.11.2002
Сообщения: 6
Откуда: Moscow

СообщениеДобавлено: Чт Ноя 14 2002 11:16    Заголовок сообщения: Re: Вариант 2 Ответить с цитатой

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

PS Огромное спасибо за помощь! Еще немного и мы найдем правильный вариант алгоритма. Подскажи пожалуйста, как бы модифицировать это, чтобы решить описанную проблемку?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Chea
Гость





СообщениеДобавлено: Пт Ноя 15 2002 07:47    Заголовок сообщения: Дополнения Ответить с цитатой

1 Тогда используемый алгоритм надо несколько модифицировать: анализировать после сортировки обе координаты - думаю на 2-м этапе (это значительно усложняет и увеличивает время)
2 Предлагаю для пробы еще 1 вариант:
а) Сортируем все п-ки по возрастанию по Х по верхнему-левому (с указанием длины по Х) Пример: Пр-к (2,3-10,5) сортируется с использованием 2 (для i-го пр-ка обозначим Хi1)и с этой двойкой тянется 8=10-2 (в сортировке не участвует - обозначим Хi2).
б)Строим граф (матрица М) где вершины Vi - прямоугольники.
Дуга от Vi к Vj строится если Xi1+Xi2 больше чем Xj1 (j больше i) M[i,j]=M[i,j]+1 для всех j пока выполняется условие Xi1+Xi2 больше Xj1
в) Сортируем Все пр-ки по Y так же как по Х
г) Дополняем граф М новыми дугами по следующему условию:
Дуга от Vj к Vi строится если Yi1+Yi2 больше чем Yj1 (j больше i) обрати внимание на индексы при построении дуг М[j,i]=M[j,i]+1 для всех j пока выполняется условие Yi1+Yi2 больше Yj1
д) В результате получаем матрицу NxN с 0,1 и 2
Из матрицы получаем группы:
К одной группе относятся вершины (пр-ки) которые имеют дуги друг к другу M[i,j]=M[j,i]=1 или 2 вершины когда из одной вершины две дуги во вторую вершину (M[i,j]=2)
т.е. проходя плностью строку и анализируя все элементы получаем список (индексы j) прямоугольников в группе.

Алгоритм срабатывает при крестах и полных охватах. Однако если есть повернутые пр-ки то требуется доработка(использовать охватывающие пр-ки, выполнять поворот, наложение по слоям и т.д.)
мой e-mail: cheanews@yandex.ru
Удачи.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...