Удалить близкие точки01.09.2026, 17:22. Показов 7088. Ответов 63
Метки нет (Все метки)
Добрый день
Есть массив/контейнер точек, напр
Спасибо
0
|
||||||
| 01.09.2026, 17:22 | |
|
Ответы с готовыми решениями:
63
Найти точки наиболее близкие друг к другу Найти две точки, наиболее близкие друг к другу Найти три точки, наиболее близкие к известной точке |
|
101 / 69 / 15
Регистрация: 16.11.2018
Сообщений: 324
|
||
| 03.09.2026, 02:38 | ||
|
Объявить переменную индекса Построить индекс над данными и выполнить запрос. По сути алгоритм индексации не такой уж и сложный вся сложность в балансировке узлов древовидной структуры областей а ее лучше заранее подогнать под механизм получения информации или параллелирование вычислений.
0
|
||
|
5534 / 2887 / 573
Регистрация: 07.11.2019
Сообщений: 4,813
|
|
| 03.09.2026, 18:45 | |
|
Зачем вообще использовать sqrt или hypot, если проще сразу сравнивать с квадратом расстояния... ? 1.0e-10
0
|
|
|
фрилансер
6506 / 5756 / 1134
Регистрация: 11.10.2019
Сообщений: 15,404
|
|
| 03.09.2026, 18:51 | |
|
u235, это следующий этап оптимизации, не надо торопить события
0
|
|
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||||||
| 03.09.2026, 19:34 | |||||||
Сообщение было отмечено Igor3D как решение
Решение<cmath> не нужен...
0
|
|||||||
|
5534 / 2887 / 573
Регистрация: 07.11.2019
Сообщений: 4,813
|
||||||
| 03.09.2026, 20:15 | ||||||
|
TheCalligrapher, слон это квадратичный алгоритм..
Ваша программа для 100000 точек у меня на телефоне работает примерно минуту. А питоновский скрипт с использованием KD-tree - около 1 секунды. Кликните здесь для просмотра всего текста
Исходники на C++, функции query_pairs можно посмотреть на github.
0
|
||||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||
| 03.09.2026, 21:13 | |||
|
Алгоритм, разумеется, является квадратичным от количества близких пар, как и любой алгоритм перечисления таких пар. (Понятно, что неквадратичного алгоритма по этой метрике нет и быть не может). Моя программа занимается решением задачи подчета, затем решением задачи удаления, а затем снова решает задачу подсчёта. Ваш питоновский скрипт решает лишь задачу подсчета. Это уже не говоря о том, что никаких усилий по оптимизации-минимизации мультипликативных и аддитивных констант в этой программе не производилось. Программа лишь иллюстрирует идею алгоритма. Я не удивлюсь, если решение с KD-tree будет сравнимо по эффективности или даже превосходить по каким-то константам, но, пожалуйста, не надо смешить собравшихся заявлениями в стиле "ваша программа - минуту, а kd-tree - секунду".
0
|
|||
| 03.09.2026, 22:21 [ТС] | ||||
|
Вы решили не хранить "регулярную" сетку (потенциально огромную), а доставать из хеша (соседние) кубы с данными (по целочисленному ключу). Нормально, но тогда соседей получается 26, плюс нужно сканировать "центральный" куб, ведь "пара" могла просто попасть в один куб. Обычно это делается незатейливыми 3 циклами for. Ну и с удалением Вы сачканули . "Есть контейнер" совсем не значит "из которого мне удобно удалять". Да, "удалить минимум точек" - такой задачи здесь не ставится, но код должен быть пригоден (с прицелом) на распараллеливание, а с немедленным erase этого нет.Итого: прилично, квадратичного перебора нет, расход памяти вполне приемлем. Все-таки многовато долбится хеш, хотелось бы большего (как всегда )![]() Да, kd-tree здесь отлично подходит, но необязательно, можно и попроще
0
|
||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||||
| 03.09.2026, 22:42 | |||||
|
0
|
|||||
|
5534 / 2887 / 573
Регистрация: 07.11.2019
Сообщений: 4,813
|
||||||||||||||||||||||||||
| 03.09.2026, 22:49 | ||||||||||||||||||||||||||
|
TheCalligrapher, у вас явно квадратичная зависимость n2 времени работы от числа точек. У kd-tree зависимость что-то типа n*log(n).
Вот результаты теста на моем компе.
0
|
||||||||||||||||||||||||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
||||||||
| 03.09.2026, 23:58 | ||||||||
count_violations (только ее) на моем компе для случайно сгенерированных в единичном кубе точек с минимальным расстоянием 1.e-3.
QueryPerformanceCounter), третье число - количество обнаруженных пар.Где вы тут увидели квадратичную зависимость - в упор не вижу. Тут может быть зависимость от реализации хеш-таблицы (на нижнем конце), зависимость от количества найденных пар (на верхнем) и прочий дребезг, но не более того. Добавлено через 38 минут В качестве экстремального примера: n точек в круге заданного минимального диаметра - это сразу n(n - 1)/2 пар без необходимости выполнения явного измерения расстояния в парах и подсчета. А вот задаче перечисления это не помогает. (Это, кстати, можно было бы использовать при выборе шага сетки в рамках моего варианта, если бы нас интересовал лишь подсчет)
0
|
||||||||
| 04.09.2026, 21:24 [ТС] | ||
|
- пристроить к каждой точке флажок и, вместо реального удаления, как сейчас, взводить этот флажок. Точку с флажком на близость не проверять. А после обсчета всех точек/кубов выполнить удаление одним проходом, типа remove_if Увы, это будет работать на одном потоке, но для многопоточной реализации такой алгоритм не годится. Тогда какой годится? Не то чтобы сразу же многопоточность, но готовиться к ней надо И еще интересный момент, пусть за рамками стартового поста. Если данные удаляются, то все ссылки на них должны быть вычищены. Кубик имеет 24 точки (вертекса) и 6 фейсов { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 }, { 12, 13, 14, 15 }, { 16, 17, 18, 19 }, { 20, 21, 22, 23 } Напр первая грань - 4-угольник из точек с индексами { 0, 1, 2, 3 } и.т.п. Если мы удаляем точку 3 (например), то вместо нее должен быть подставлен другой индекс из оставшихся, необязательно тоже 3. Др словами wireframe (проволочный каркас) кубика с 8 точками должен рисоваться так же как и с исходными 24 Ну это если есть (здоровый) интерес, в стартовый пост это не входит
0
|
||
| 05.09.2026, 19:03 | ||
|
Не по теме:
0
|
||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|
| 05.09.2026, 22:42 | |
|
Не по теме: Это не более чем старпёровское интуитивное неприятие O(1) поисковой производительности хэш-таблиц. Я тоже помню, как когда-то, гордо загруженный ахоульмановскими сортировками, сбалансированными деревьями, и прочими высушенными донельзя логарифмами, я, a wee lad, с отвисшей челюстью, глазами как блюдца и желанием закричать "Вы все вретиии!" смотрел на заявления о том, что хэш-таблица реализует ассоциативный массив за невероятное O(1). Но, как ни вертись, со временем понимание приходит. И вот уже дорогие нашему сердцу, элегантные в своей остроумности "разделяй-и-властвуй" заменяются на "тупейшие" и лежащие на поверхности идеи разбрасывания данных по хэшированным ведрам. Дело доходит даже до того, что источники перестают тратить время и место на упоминание древесной классики, а целиком и полностью фокусируются на хэшированных подходах, так как последние кроют первые, как бык овцу (см. ссылку). Но это вот интуитивное неприятие волшебного O(1) еще долго никуда не денется, потому обскурантисты будут продолжать пихать всякие KD-деревья в те темы, к которых они уже давно совершенно неуместны и в которых у них нет никаких шансов. Кстати, так как, согласно объяснениям TC, понятие "расстояния между точками" не имеет самостоятельной абсолютной ценности, а является лишь способом черно-белого разделения точек на "близко-не близко", можно подумать о том, чтобы заменить метрику расстояния с евклидовой L2 на чебышевскую Linf. Круг станет осеориентированным квадратом, понятие "близко-не близко" для заявленных целей исказится при этом незначительно, а вот возможностей для оптимизации алгоритма на прямоугольной сетке станет больше. Хотя, опять же, особенно ярко блистать эти оптимизации будет скорее в задаче подсчета, а ТС нужно решение задачи перечисления...
0
|
|
| 06.09.2026, 13:30 [ТС] | ||||
|
Не по теме:
Еще раз замечу что kd-tree - отличный, но не единственный вариант, есть и более простое решение "Удалить близкие точки", не надо все сводить к "поиску ближних точек". Да, поиск есть/актуален, но не только. Удалять-то как будем? Дергать вектор за вымя? "Подстелить соломки" std::list? Серьезнее, товарищи, и многопоточность не забываем.
0
|
||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
||
| 07.09.2026, 03:15 | ||
|
KD-tree, в обмен на свою (сравнительную) громоздкость и накладные расходы, дает вам лишь одно преимущество в контексте таких задач: единожды построенное KD-tree можно использовать много раз для решения задачи поиска точек для разных расстояний. То есть параметры препроцессированной структуры данных никак не зависят от того, для какого расстояния мы потом будем решать задачу. В подходе же с сеткой расстояние нужно знать заранее. Но нам в контексте этой задачи это преимущество совершенно не нужно. Потому KD-tree и является таким неповоротливым overkill-ом для ее решения. Однако стоит заметить еще и то, что исходные алгоритмы по ссылке не являются алгоритмами решения именно данной задачи, а являются алгоритмами решения задачи поиска ближайшей пары точеку, где расстояние заранее неизвестно. И даже там авторы предпринимали усилия для нахождения минимального расстояния в случайной выборке из n пар точек, чтобы потом использовать его для построения сетки и решения всей задачи. То есть даже при заранее неизвестном расстоянии, такой алгоритм все равно работает за ожидаемое время O(n). Это просто одна из тех задач, где "волшебное" поведение хэш-таблиц действительно срабатывает. Просто оставьте KD-trees для тех задач, где они уместны. А здесь у них нет никаких шансов.
0
|
||
| 07.09.2026, 18:24 [ТС] | ||||
Пусть каждый остается при своем мнении, но с задачей/удалением что?
0
|
||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
||||
| 07.09.2026, 19:17 | ||||
|
P.S. Кстати, опытный читатель также заметит тот факт, что в наших тестах мы использовали случайно сгенерированные и равномерно распределенные точки. Это играет на руку "древесных" реализаций тем, что построенное из таких точек дерево уже само собой получится сбалансированным. Даже если использованная реализация содержит усилия по балансировке строящегося дерева, они все равно будут либо дешевыми, либо вообще практически нулевыми из-за "хорошести" входного потока точек (я не заглядывал в реализацию этого KD-дерева и не могу судить о том, сколько усилий там тратится на банансировку). Но в реальной задаче (в частности - в вашей) точки "хорошими" не будут. Скорее наоборот, они будут проявлять тенденцию к кластеризации. Сеточный алгоритм, однако, совершенно не чувствителен к этому.
0
|
||||
|
5534 / 2887 / 573
Регистрация: 07.11.2019
Сообщений: 4,813
|
|||||||||||
| 07.09.2026, 21:40 | |||||||||||
|
Igor3D, если хотели удалить, то удаляйте.
Кликните здесь для просмотра всего текста
Не по теме:
pairs - упорядоченные пары индексов точек, у которых расстояние менее заданого. Т.е. можно удалить только точки, соответствующие первым индексам из пар (как я и сделал). Или вообще все индексы (и первые, и вторые). В изначальном вопросе это специально не оговаривается. Также не оговаривается случай, если, например, три или более точки находятся близко, какие из них удалять?
0
|
|||||||||||
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
|
||
| 08.09.2026, 08:16 | ||
|
0
|
||
|
Нарушитель
6341 / 3075 / 1064
Регистрация: 01.06.2021
Сообщений: 11,826
|
|
| 08.09.2026, 12:25 | |
|
u235, а мне вот интересно, какое может быть прикладное значение у данного задания. Интересует ваше мнение, возможно вы уже сталкивались с этим на практике?
Вот в этой симуляции https://royalxxx.itch.io/abstraction-benchmark изначально я удалял точки, которые отдалялись на некое расстояние. Однако, поскольку в игровых движках добавление и удаление объектов на сцену тяжелая и ресурсозатратная операция, которая понижает fps, я перестал удалять точки, а начал их просто перемещать (хотя, визуально кажется, что точки уничтожаются, но это не так). Грубо говоря, я реализовал паттерн объектного пула, чтобы переиспользовать ресурсы.
0
|
|
| 08.09.2026, 12:25 | |
|
Значения близкие к нулю
Найти близкие по значению элементы матрицы Вывести все возможные числа, которые при возведении в квадрат дадут результаты, наиболее близкие к N Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
|
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|