|
8 / 8 / 0
Регистрация: 17.11.2012
Сообщений: 159
|
|
Проредить точки на плоскости, в соответствии с заданным максимальным расстоянием03.04.2016, 05:17. Показов 1743. Ответов 8
Метки нет (Все метки)
Здравствуйте! Не могу додуматься, как наиболее оптимально решить задачу: задано множество точек на плоскости, точки распределены неравномерно (густота точек в различных частях плоскости разная). Требуется наиболее оптимальным способом найти подмножество этих точек, такое, чтобы минимальное расстояние между любыми двумя соседними точками было не меньше заданного. Такое подмножество не единственно, нужно найти только одно, любое. Мне приходят в голову очень не оптимальные решения. Точек может быть больше миллиона, поэтому и требуется скорость. Не плохо бы, если можно было бы находить такое множество за время меньше секунды, если это реально.
0
|
|
| 03.04.2016, 05:17 | |
|
Ответы с готовыми решениями:
8
Найти уравнения двух прямых на плоскости, проходящих через две данные точки с заданным расстоянием между ними Среди множества точек найти две точки с максимальным расстоянием между ними
|
|
Вездепух
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
|
|
|
Модератор
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
|
|
|
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
|
|
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||
| 03.04.2016, 19:50 | ||
|
Базовый факт тут таков: чтобы решить эту задачу эффективно, вам придется выполнить препроцессинг ваших данных. То есть еще до того, как вы займетесь собственно обработкой точек, вам надо будет организовать эти точки в некую эффективную структуру данных, которая поможет вам выполнить удаление. На эту организацию точек придется потратить время, именно до начала собственно решения задачи. И в общем случае, чем эффективнее будет эта структура данных (чем быстрее вы хотите сделать процесс удаления точек), тем больше времени придется потратить на построение этой структуры на этапе препроцесинга. Поэтому тут важно выбрать некую золотую средину - не тратить время на выполнение слишком хитрого препроцессинга, когда более простой тоже решил бы задачу. Поэтому я и предлагаю вам выполнить простейший препроцессинг. Разбрасывание точек по ячейкам равномерной прямоугольной сетки - элементарнейшая задача, которая тем не менее существенно ускорит последующий процесс удаления точек. Вопрос только в выборе размера клетки, но это задача творческая и во многом эмпирическая - поиграетесь с разными размерами, посмотрите какой работает лучше всего на ваших данных. И еще раз: без препроцессинга точек решить эту задачу эффективно никаких шансов нет. (Другое дело, если ваши точки с самого начала приходят к вам не свалкой, а уже организованными в некую эффективную структуру данных. Но вы нам ничего такого не говорили, а телепатов тут нет.)
1
|
||
|
Модератор
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 [ТС] | ||||
|
0
|
||||
| 03.04.2016, 23:03 | |
|
Помогаю со студенческими работами здесь
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. Пошагово создадим проект для загрузки изображения. . .
|