Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2010, 20:10   #1
Inokentiy
 
Регистрация: 17.04.2010
Сообщений: 9
По умолчанию Найти минимальное множество прямых

На плоскости заданы N точек. Найти минимальное множество прямых, на которых можно разместить все точки.
Не понятно каким образом найти имено минимальное множество прямых???
Inokentiy вне форума Ответить с цитированием
Старый 17.04.2010, 22:22   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Можно в лоб.
Строим всевозможные прямые, их кол-во <= сумма от 1 до N-1.
Для каждой прямой заводим массив где будут хранится порядковые номера точек, которые принадлежат этой прямой и их кол-во.
Проверять принадлежность так: дана прямая на точках O(x0, y0), Oi(xi, yi), её характеристики Следующие:
A:=yi-y0;
B:=x0-xi;
C:=-A*x0-B*y0; (пишу на память, могу ошибиться в знаках)
точка Z(x, y) принадлежит прямой, если равенство C=-A*x-B*y верно. .

Ответ получаем в цикле. Берём прямые которые содержат N точек, затем N-1, N-2 точек, и т.д. пока точки не кончатся. При этом каждый раз при выборе прямой нужно будет вычёркивать из расчёта эти точки (т.е. понижать число точек у тех прямых, которые содержат точки выбранной прямой). При каждой удачной выборке увеличиваем счётчик. В конце может остаться одна точка, тогда просто увеличим счётчик ещё раз. Этот счётчик и будет ответом.

Описание длинное и страшное, но код должен быть небольшой. При построении прямых можно использовать рекурсию.
P.S. Это всего-лишь алгоритм, оптимизации никакой.
eoln вне форума Ответить с цитированием
Старый 19.04.2010, 05:43   #3
Inokentiy
 
Регистрация: 17.04.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Этот счётчик и будет ответом.
Ответом должен быть не счетчик а множество прямых,но с этим еще ладно.
А что если у нас есть три точки,не лежащие на одной прямой?
Тогда мы берем прямую с N-1 то есть с двумя точками, допустим сохраняем ее в какой-нибудь структуре данных(например в либо массиве,ли на крайний случай в линейном списке) и удаляем первые две точки,а что делать с третьей точкой и как проводить через нее прямую, если точек больше нет???
Inokentiy вне форума Ответить с цитированием
Старый 19.04.2010, 07:15   #4
Serebro
FORTRAN programmer
Форумчанин
 
Регистрация: 08.12.2009
Сообщений: 153
По умолчанию

Если после исключений останется одна точка, то пишем в результат +1 прямую (прямая с любой точкой).
Serebro вне форума Ответить с цитированием
Старый 19.04.2010, 07:23   #5
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Все правильно, если влоб - то именно так и делать, без любых оптимизаций будет О(N^3) (N^2 прямых, порядка N вхождений в перебор).
LeBron вне форума Ответить с цитированием
Старый 19.04.2010, 13:10   #6
Inokentiy
 
Регистрация: 17.04.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
в лоб
А что тогда значит не в лоб?
И можно ли здесь применить динамическое программирование и рекурсию?(как?)

Последний раз редактировалось Inokentiy; 19.04.2010 в 17:00.
Inokentiy вне форума Ответить с цитированием
Старый 21.04.2010, 04:50   #7
Inokentiy
 
Регистрация: 17.04.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
При построении прямых можно использовать рекурсию.
Как именно ее использовать?
Inokentiy вне форума Ответить с цитированием
Старый 21.04.2010, 22:48   #8
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Я даже неверно оценил, там не куб, а биквадрат, так как на каждом шагу надо будет еще проверять все точки на принадлежность прямой. Можно оптимизировать до куба на логарифм, если вкрутить сортировку и бинарник по парамерту.
LeBron вне форума Ответить с цитированием
Старый 21.04.2010, 22:52   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Ага, в проекте пример решения в лоб без оптимизации с графикой и объяснением. Без графики для 100 точек - 0,3 сек, для 200 точек - 3 сек, для 400 точек 10 сек и 130 МБ памяти, для 1000 точек у меня оперативки не хватило
Вложения
Тип файла: rar lines.rar (169.8 Кб, 39 просмотров)
eoln вне форума Ответить с цитированием
Старый 22.04.2010, 08:59   #10
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
эксель. найти максимальное и минимальное значение функции alex(21) Помощь студентам 2 07.03.2010 12:22
Найти из N чисел минимальное Shevali Помощь студентам 2 31.03.2009 17:23
Три квадратных уравнения. Найти минимальное значение среди действительных корней этих уравнений. Паскаль. GE076 Помощь студентам 2 17.12.2007 20:41
Построение прямых Aleksandr Общие вопросы Delphi 21 19.06.2007 15:44