Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
8 / 8 / 0
Регистрация: 17.11.2012
Сообщений: 159

Проредить точки на плоскости, в соответствии с заданным максимальным расстоянием

03.04.2016, 05:17. Показов 1743. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Не могу додуматься, как наиболее оптимально решить задачу: задано множество точек на плоскости, точки распределены неравномерно (густота точек в различных частях плоскости разная). Требуется наиболее оптимальным способом найти подмножество этих точек, такое, чтобы минимальное расстояние между любыми двумя соседними точками было не меньше заданного. Такое подмножество не единственно, нужно найти только одно, любое. Мне приходят в голову очень не оптимальные решения. Точек может быть больше миллиона, поэтому и требуется скорость. Не плохо бы, если можно было бы находить такое множество за время меньше секунды, если это реально.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2016, 05:17
Ответы с готовыми решениями:

Найти уравнения двух прямых на плоскости, проходящих через две данные точки с заданным расстоянием между ними
Добрый вечер. Нужна помощь в выполнении расчетной работы. Задание 1:Через начало координат и точку М (1; 3) проходят две параллельные...

Среди множества точек найти две точки с максимальным расстоянием между ними
Помогите срочно!!! Среди множества точек найти две точки с максимальным расстоянием между ними!!! С циклами! ОЧень срочно!!!

Среди заданного множества точек найти две точки с максимальным расстоянием между ними
Среди заданного множества точек найти две точки с максимальным расстоянием между ними. то есть мы сами задаем координаты...

8
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
03.04.2016, 10:43
Лучший ответ Сообщение было отмечено Павлушечка как решение

Решение

Странная постановка задачи - любое решение, без каких-то дополнительных критериев. Тогда можно просто выкинуть все точки, кроме одной любой. Все - задача решена.

Я полагаю, что вам все таки нужно сохранить какие-то (условно максимальное) количество точек. Итак, если нужно найти любое решение, "разумно" удовлетворяющее условию, то стратегия тут очевидна: берем первую (любую) точку, и уничтожаем все другие точки, попавшие внутрь заданного радиуса от исходной. Берем следующую точку (любую из оставшихся) и повторяем процесс. И т.д.

Тут, конечно, возникает задача поиска точек, попавших в круг. Чтобы решить ее максимально эффективно, необходимо строить довольно хитрые структуры данных (k-d деревья, quad деревья и т.п.), помогающие делать эффективный поиск точек в ограниченном радиусе. Но я не знаю, нужны ли это вам все эти сложности. Скорее всего нет.

Вы можете просто предварительно разбить плоскость на прямоугольные ячейки с шагом в ваш радиус (как клетчатая бумага), или лучше даже с меньшим шагом, и предварительно разбросать ваши точки по этим ячейкам. Зная, какие точки принадлежат каждой ячейке можно довольно эффективно ограничивать поиск, т.е. мгновенно распознавать и удалять точки, заведомо лежащие внутри радиуса, и мгновенно исключать из рассмотрения те точки, которые заведомо лежат за пределами радиуса.
2
8 / 8 / 0
Регистрация: 17.11.2012
Сообщений: 159
03.04.2016, 15:51  [ТС]
Да, вы правы, поставил задачу не так, как нужно, но вы правильно поняли, что я хочу. Идея, насчет удаления точек, попадающих в окружность с центром в каждой точке и размером с нужный радиус приходила, но моего опыта не хватает, чтобы быть уверенным, что это будет работать за время не большее секунды. Тут же, мне видится, массивами обойтись трудно, придется искать контейнеры, с возможностью удаления произвольного элемента, а контейнеры относительно медленные. Кстати, а можно поподробнее насчет сетки? Допустим, задали сетку, разве прорежение будет эффективнее, чем без нее?
P.S. А неоднозначность, которая имелась ввиду, заключалась в том, что, если мы применим описанный Вами алгоритм, начиная с различных точек, то результат будет различен, и мне не важно, какой именно, главное, чтобы быстро.

Добавлено через 19 минут
Правильно ли я понимаю, что для хранения точек лучше использовать массив массивов, причем каждый массив в данном массиве - точка и состоит из двух элементов (x,y). А чтобы не использовать контейнеры, создать еще массив типа bool, в котором будет описываться принадлежность точек с данным порядковым номером к новому, прореженному множеству?
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,458
03.04.2016, 16:42
Сетка поможет в том плане что при анализе вы сможете перебирать не все точки а только точки из одной или смежных ячеек
0
8 / 8 / 0
Регистрация: 17.11.2012
Сообщений: 159
03.04.2016, 18:48  [ТС]
Ну а чем это лучше? Ведь придется рассчитывать дополнительно, какие точки принадлежат данной ячейке. Не вижу, как это можно применить, для того, чтобы быстрее было.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.04.2016, 19:35
Павлушечка, Пусть N число точек. Выберем число ячеек M, например M пропорционально N.
Тогда разбиение массива точек на M массивов - сложность линейная.
Определение ближайших - сложность O(N*N/M)=(т.к. N/M=const)=O(N) - линейная.
А если не разбивать - каждую точку сравниваем с каждой - сложность квадратичная.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
03.04.2016, 19:50
Цитата Сообщение от Павлушечка Посмотреть сообщение
Ведь придется рассчитывать дополнительно, какие точки принадлежат данной ячейке.
А без этого вы никак не обойдетесь.

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

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

Поэтому я и предлагаю вам выполнить простейший препроцессинг. Разбрасывание точек по ячейкам равномерной прямоугольной сетки - элементарнейшая задача, которая тем не менее существенно ускорит последующий процесс удаления точек. Вопрос только в выборе размера клетки, но это задача творческая и во многом эмпирическая - поиграетесь с разными размерами, посмотрите какой работает лучше всего на ваших данных.

И еще раз: без препроцессинга точек решить эту задачу эффективно никаких шансов нет.

(Другое дело, если ваши точки с самого начала приходят к вам не свалкой, а уже организованными в некую эффективную структуру данных. Но вы нам ничего такого не говорили, а телепатов тут нет.)
1
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,458
03.04.2016, 20:26
Если сетка 100 на 100 а точек 1 млн то в одной ячейке 100 точек - пробежать по ним легче чем по всему млн
1
8 / 8 / 0
Регистрация: 17.11.2012
Сообщений: 159
03.04.2016, 23:03  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
Павлушечка, Пусть N число точек. Выберем число ячеек M, например M пропорционально N.
Тогда разбиение массива точек на M массивов - сложность линейная.
Определение ближайших - сложность O(N*N/M)=(т.к. N/M=const)=O(N) - линейная.
А если не разбивать - каждую точку сравниваем с каждой - сложность квадратичная.
О, спасибо, теперь ясно.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
(Другое дело, если ваши точки с самого начала приходят к вам не свалкой, а уже организованными в некую эффективную структуру данных. Но вы нам ничего такого не говорили, а телепатов тут нет.)
Точки приходят свалкой (изредка - нет).
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И еще раз: без препроцессинга точек решить эту задачу эффективно никаких шансов нет.
Хорошо, спасибо, сделаю, как сказали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2016, 23:03
Помогаю со студенческими работами здесь

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

Вычислить значение выражения в соответствии с принадлежностью точки к заданным областям
Для действительных Х и У, определяющих координату точки А(Х,У) в декартовых координатах, определить значение SPO

Перечислить точки заданного множества точек на плоскости в соответствии с порядком
Порядок на точках плоскости определим следующим образом: (х,у)=<(u,v), если либо x=<v. Перечислить точки заданного множества точек на...

Перечислить точки заданного множества точек на плоскости в соответствии с данным порядком
Порядок на точках плоскости определим следующим образом: (х,у)=<(u,v), если либо x=<v. Перечислить точки заданного множества точек на...

По заданным координатам точки определить, какому квадранту координатной плоскости она принадлежит
Доброго времени суток. Помогите решите задачки пожалуйста :) 3. По заданным координатам точки определить, какому квадранту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru