Алгоритм поиска крайних точек среди множества #676660


#0 by ИС-2
Есть зоны с множеством входящих в них точек (географические координаты). Как определить среди них крайние, чтобы потом построить многоугольник и очертить зону? Есть какой-то несложный алгоритм, кроме тупого перебора?
#1 by jsmith82
бинарный поиск
#2 by jsmith82
#3 by jsmith82
#4 by jsmith82
#5 by 1Сергей
в трехмерном пространстве?
#6 by jsmith82
вот работающий пример на
#7 by jsmith82
+ на javascript
#8 by Лодырь
Топикстартер недвусмысленно намекает что у него не плоскость, а поверхность земного шара.
#9 by Lama12
Не совсем в теме, но разве нельзя, для данной задачи, точки с трехмерными координатами представить в виде проекций на 3 плоскости?
#10 by Лодырь
Насколько я понимаю, при стандартной развертке, прямые на плоскости превратятся в кривые на сфере и наоборот.
#11 by Lama12
Сомнения понял.
#12 by vde69
задача автора это часть алгоритма
#13 by Лодырь
вот еще ссылки
#14 by ИС-2
спс думаю в пределах одного города землю можно считать плоской
#15 by ИС-2
кто-то использовал пакет R хочу его приспособить для задачи
#16 by ИС-2
#17 by dk
нафига внешние пакеты? очень много данных и время поиска критично? можно тупо в 1с 1. выбрать крайнюю точку (максимум или минимум по любой из координат) 2. строить линию к остальным точкам и проверять лежат ли все остальные точки множества (слева или справа от линии) 3. если все точки множества слева или справа, то это тоже крайняя точка - сохраняем и идем дальше 4. если не крайняя, то идем дальше --- тока надо придумать что делать если все точки на одной линии
#18 by Лодырь
Если все оставшиеся на линии - выбираем самую дальнюю от текущей и завершаем работу. Если на первом шаге все лежат на 1 линии - идем в соседний отдел убивать шутника а потом таки включаем самую дальнюю точку и завершаем работу.
#19 by Fragster
а я представил себе алгоритм с преобразованием в полярные координаты, поиск точки с минимальным углом и (если несколько) максимальным расстоянием. Сдвиг обычной системы координат в эту точку, повторение. как только дойдем 2й раз до 1 и той же точки - профит.
#20 by Лодырь
Это все варианты алгоритма Джарвиса. По сути одно и тоже.
#21 by ИС-2
сказали, что там есть. В алгоритме предполагается что фигура выпуклая, а у меня может быть любая. Аналогия с проведением точек в конверте (центральная точка). Задачу я сформулировал не корректно. Мне надо "обтянуть" точки, а не просто выделить крайние. Т.е может получиться и "сосиска" и "полумесяц" и т.д.
#22 by Зойч
если проводить фигуру по крайним точкам то НЕ может получиться полумесяц
#23 by dk
левый или правый вариант?
#24 by ИС-2
левый
#25 by dk
а если усложнить ? )))
#26 by Rie
Сформулируй задачу корректно - и люди к тебе потянутся. (Но тебе это будет уже не нужно - поскольку при правильной формулировке решение будет сразу видно).
#27 by ИС-2
у меня есть понимание того, что хочу. Определить зоны где есть клиенты на карте. Но сформулировать...
#28 by vde69
что-то мне подсказывает: данная задача гарантировано лежив в алгоритме из
#29 by dk
а почему не ?
#30 by Rie
Август... Опытные телепяты - лечатся от жары на пляжах Египта. и уже кучу алгоритмов предложили. Но, видать, телепатией они не страдают.
#31 by vde69
вообще большенство не линейных задач комбинаторики строятся на триангуляции Делона
#32 by Rie
Попробую догадаться... Построй отрезки между всеми точками. Удали пересекающиеся. Удали внутренние. (Строить _все_ - не обязательно). (Внимательно читай, что пишет).
#33 by vde69
тут есть маленькая загвостка... если у нас 10 000 точек сколько будет отрезков "Построй отрезки между всеми точками" ??? а если точек будет лям :) я реализовывал в 1с триангуляцию на подобных массивах точек :)
#34 by Rie
Тут есть большая загвоздка - а что именно хочет ТС? Насчёт "маленькой загвоздки" - это да. Поэтому на тебя и ссылаюсь. Но пусть сначала хоть какое-то решение найдёт. При малых n. И убедится, что это - то, что ему надо. А то будет искать эффективный алгоритм не для того. ведь не зря примерчики подкидывал.
#35 by ИС-2
попробую в начале и хоть посмотрю, что получиться
#36 by Rie
Получишь правый вариант из .
#37 by vde69
вот еще прикольный алгоритм, пригодный например для минимальной топологиии сети
#38 by bahmet
мдя..судя по рисунку меньше играть в танки надо. Почему внутренние точки сверху удостоились войти в крайние, а внизу нет. Это типа гравитация сверху вниз и нить провисла?))
#39 by NS
Построение выпуклой оболочки обходом Грэхэма Даны N точек на плоскости. Построить их выпуклую оболочку, т.е. наименьший выпуклый многоугольник, содержащий все эти точки. Мы рассмотрим метод Грэхэма (Graham) (предложен в 1972 г.) с улучшениями Эндрю (Andrew) (1979 г.). С его помощью можно построить выпуклую оболочку за время O (N log N) с использованием только операций сравнения, сложения и умножения. Алгоритм является асимптотически оптимальным (доказано, что не существует алгоритма с лучшей асимптотикой), хотя в некоторых задачах он неприемлем (в случае параллельной обработки или при online-обработке).
#40 by vde69
в 90х я использовал поиск по наименьшему углу, не знаю есть такие алгоритмы так сказать академически, но тогда сам придумал и само работало, на XT контур из 10 000 точек строило около минуты, работало :)
#41 by NS
Наименьший угол - это сложность O(n^2), что неприемлемо на практике.
#42 by vde69
не совсем, там для каждой точки есть 4 четверти, и в зависимости от ее расположение анализировать нужно максимум 1/2 а идеале 1/4 углов
#43 by Fragster
это наихудший вариант
#44 by NS
? О(1/4*n*n)=O(n*n), по определению. Всегда O(n^2)
#45 by Torquader
А если решать задачу последовательно: 1) Берём три точки - получаем треугольник. 2) Последовательно добавляем точки - если точка оказывается внутри фигуры-многогранника, то она внутренняя, если она выходит за какую-то грань, то добавляется два отрезка, если за несколько граней, то происходит спрямление, то есть выкидываются точки, ставшие внутренними.
#46 by NS
В ветке приведен алгоритм, про который доказано что он асимптотически лучший.
#47 by Torquader
Так я и не претендую на лучший. Для реализации достаточно, чтобы алгоритм был понятный. P.S. если переходить к тетраэдрам и плоскостям, то можно и в объёме также действовать.
#48 by Лодырь
Уважаемые, а вы таки смогли понять чего хочет топикстартер указывая что он хочет "обтянуть крайние точки, а не просто выделить крайние". Потому что не будет однозначного решения в его случае. Какой из вариантов больше нравится топикстартеру в случае всего лишь 5 точек?
#49 by Torquader
Крайние точки - фигура должна быть выпуклой, то есть решение однозначно. Конечно, если допустить невыпуклые фигуры, тогда все точки получаются крайними, так как их множество дискретно.
#50 by Лодырь
Читай и смотри . Там ясно написано, что он хочет не обязательно выпуклую оболочку ) А критериев не приводится. Сдается мне что ему придется копать в сторону разделов кластерного анализа, а именно построения оболочек кластера (cluster hull)
#51 by NS
Если он сам не знает чего хочет - никто помочь не сможет.
#52 by Torquader
Видимо, он хочет не "множество", а оптимальный маршрут, чтобы посетить всех клиентов, но это совершенно другая задача. В принципе, если грамотно поставить критерии "правильности" и решать задачу на экстремум функционала, то решение будет найдено.
#53 by ИС-2
сделал по принципу черного ящика. Использовал пакет R. Вот сценарий для выполнения: X<-read.table("//1c/Coordinates/InPutCoord.txt", dec=",", sep = " ") #X<-read.table("D:/R/InPutCoord.txt", dec=",", sep = " ") as.matrix(X) chull(as.matrix(X)) Y<-chull(as.matrix(X)) write(Y, "//1c/Coordinates/ExtremeCoord.txt", 1)
#54 by acsent
почему Chull?
#55 by ИС-2
потому, что сказали использовать chull . Вот так. Что еще можно использовать?
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям