С Новым годом! Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 24
1

Найти точку в к-мерном пространстве

22.09.2013, 18:33. Показов 1225. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть к-мерное дискретное (целочисленное) пространство. В нем отмечены некоторые точки. Нужно найти такую точку, что если через нее провести прямые параллельные базисным векторам, то на них будет лежать максимальное число точек. Если таких несколько, то нужно найти все. Как это можно сделать не перебирая все точки пространства?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2013, 18:33
Ответы с готовыми решениями:

Найти наибольший угол треугольника заданного координатами в 4-мерном пространстве
Найти наибольший угол треугольника АВС, заданного координатами в 4-мерном пространстве А (3,1,-1,0)...

Найти в n-мерном пространстве min расстояние от начала координат до отрезка, заданного координатами концов
Найти в n-мерном пространстве минимальное расстояние от начала координат до отрезка , заданного...

Треугольники в 3х мерном пространстве
Помогите пожалуйса написать программу, Задание: Для вещественных чисел Х1, У1, Z1, Х2, У2, Z2,...

Задача в 3х-мерном пространстве
В 3х-мерном пространстве, равномерно и прямолинейно движутся 4 объекта - A, B, C и D их траектории...

19
21 / 21 / 1
Регистрация: 28.05.2010
Сообщений: 67
22.09.2013, 23:03 2
Пусть точек https://www.cyberforum.ru/cgi-bin/latex.cgi?N. Решение в лоб (перебираем все пары точек, увеличиваем счетчик, если ровно одна из координат совпадает, в конце берем точки с максимальным значением счетчика) требует https://www.cyberforum.ru/cgi-bin/latex.cgi?N^2\cdot k сравнений. Чтобы его сократить:

1. Сортируем точки по каждой из координат. Теперь точки у которых совпадает одна из координат лежат рядом в соответствующем массиве.

2. Перебираем точки
2.1. Каждую ищем в отсортированных массивах.

2.2. Составляем список точек, совпадающих по координате с данной.

2.3. Считаем точки, встречающиеся в этом списке ровно один раз. Увеличиваем на эту величину счетчик для текущей точки и на 1 для всех встречающихся один раз точек.

2.4. Удаляем текущую точку из отсортированных массивов.

3. Берем точки с максимальным значением счетчика.

Получаем сложность порядка https://www.cyberforum.ru/cgi-bin/latex.cgi?N\log_{2}N\cdot k.
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 24
23.09.2013, 00:37  [ТС] 3
Цитата Сообщение от dikanev Посмотреть сообщение
Пусть точек https://www.cyberforum.ru/cgi-bin/latex.cgi?N. Решение в лоб (перебираем все пары точек, увеличиваем счетчик, если ровно одна из координат совпадает, в конце берем точки с максимальным значением счетчика)
Может получиться так, что нужной точки нет в исходном массиве. Пример датасета для 2-мерного пространства:
3,3 1,3 3,3 0,2 2,2 1,3
Ответом здесь будут точки 0,3 и 2,3

Добавлено через 8 минут
Замечу, что для 2мерного случая решение несложное, но с обощением на к-мерность возникают проблемы. Например, для 3мерного случая нам придется рассматривать каждую плоскость соответствующую 3ей координате. Собственно вопрос в том, как избежать такого перебора.
Кроме того, если ровно одна координата совпадает, то через такие точки нельзя провести прямую параллельную базису. Если ровно одна координата различается, тогда можно.
0
21 / 21 / 1
Регистрация: 28.05.2010
Сообщений: 67
23.09.2013, 01:15 4
Вижу, что я неправильно понял условие задачи и предложил алгоритм для поиска наилучшей точки из отмеченных. Надо еще подумать, но уже поздно. Завтра подумаю.
0
834 / 642 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
23.09.2013, 11:41 5
Имея set <все_точки>, для каждой размерности сохранить map <координата, количество>. Последовательно для каждой пары осей перебираем точку из их map'ов. Полученная точка однозначно оределяет все вектора - считаем для них число точек, проверив дополнительно существует ли точка, которая является пересечением осей. Ассимптотика O(n^4).
0
1911 / 773 / 108
Регистрация: 01.10.2012
Сообщений: 4,200
23.09.2013, 12:17 6
Цитата Сообщение от Qwertiy Посмотреть сообщение
Имея set <все_точки>, для каждой размерности сохранить map <координата, количество>. Последовательно для каждой пары осей перебираем точку из их map'ов. Полученная точка однозначно оределяет все вектора - считаем для них число точек, проверив дополнительно существует ли точка, которая является пересечением осей. Ассимптотика O(n^4).
Как-то жирно, ресурсозатратно (в духе высокоуровневых языков). Я бы сортировал указатели на точки по x, y, z. Тогда образуется такая структурка
C++
1
2
3
struct CLine {
 int mBeg, mEnd;   // индекс в сортированном массиве, все точки от mBeg до mEnd имеют одинаковые x и y, разный z
};
Сделал так же для всех комбинаций осей (y, z, x)(z, x, y) - имею 3 контейнера CLine. Отсортировал 2 последних по X. Иду по первому, двоичным поиском ищу в 2 последних. Повторяю эту процедуру число осей - 1 раз
0
834 / 642 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
23.09.2013, 12:25 7
Цитата Сообщение от Igor3D Посмотреть сообщение
Я бы сортировал указатели на точки по x, y, z.
А ничего что пространство k-мерное, а не 3-мерное?

Добавлено через 3 минуты
Цитата Сообщение от Qwertiy Посмотреть сообщение
Ассимптотика O(n^4).
Наврал.

Добавлено через 3 минуты
Ассимптотика O(k^3*n^2):
k^2 - перебор двух осей
n^2 - перебор точек на осях
k - подсчёт по оставшимся k-2 осям
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 24
23.09.2013, 14:19  [ТС] 8
Имея set <все_точки>
Извиняюсь, я забыл упомянуть, что у нас может быть "несколько точек в одной точке". Так что на входе у нас multiset.

И я не слишком понял идею алгоритма. Не могли бы вы поподробнее описать что мы делаем на примере такого датасета:
1,3,3 2,1,3 3,3,3 1,0,2 1,2,2 0,1,3

Добавлено через 24 минуты
По сути задачу можно сформулировать так: найти такую точку, чтобы как можно большее число точек, подающихся на вход, отличалось от нее не более чем в 1 координате (на самом деле не более чем в d, но мне хотя бы при d=1 разобраться)
0
834 / 642 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
23.09.2013, 16:14 9
Цитата Сообщение от DarthLenin Посмотреть сообщение
Не могли бы вы поподробнее описать что мы делаем
Хм.. Кажется, я бред написал...
Думал, что так получится, но тут что-то не то
0
1911 / 773 / 108
Регистрация: 01.10.2012
Сообщений: 4,200
23.09.2013, 17:17 10
Давайте закончим с "первоначальной" постановкой задачи Здесь все ясно: для каждой точки заводим k счетчиков (к - число осей). Сортируя точки k раз заполняем счетчики используя интервал точек сортированного массива отличающихся лишь по одной оси (последний ключ сортировки)

Цитата Сообщение от DarthLenin Посмотреть сообщение
По сути задачу можно сформулировать так: найти такую точку, чтобы как можно большее число точек, подающихся на вход, отличалось от нее не более чем в 1 координате (на самом деле не более чем в d, но мне хотя бы при d=1 разобраться)
Не слабо... Др словами - "найти точку с максимальной плотностью (d)"?

Добавлено через 3 минуты
Неясно что имеется ввиду. Напр 2 точки, расстояние между ними по x < 1. но по др оси напр 1000. Такие точки считаются или как?
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 24
23.09.2013, 17:26  [ТС] 11
Цитата Сообщение от Igor3D Посмотреть сообщение
Не слабо... Др словами - "найти точку с максимальной плотностью (d)"?
Ну...Не вполне уверен, что я правильно понимаю что такое плотность(d). Точки могут не быть сосредоточены геометрически близко. Но для 3мерного пространства это будет означать при d=1 что мы проводим через точку прямые, при d=2 - плоскости, при d=3 - куб (ну тут уже, очевидно, подойдет любая точка пространства). В общем, по-моему переформулировка получилась более понятной, т.к. она избавляет от геометрического смысла.

Добавлено через 4 минуты
Цитата Сообщение от Igor3D Посмотреть сообщение
Неясно что имеется ввиду. Напр 2 точки, расстояние между ними по x < 1. но по др оси напр 1000. Такие точки считаются или как?
Пространство, как я писал, дискретное. Допускаются только целые координаты. Если точки отличаются только по одной координате, неважно на сколько, то они лежат на одной прямой (параллельной какому-то базисному вектору) и следовательно считаются. Еще раз сформулирую: нужно найти такую точку, чтобы изменением ровно d координат (раз уж упомянул, будем говорить более обощенно, чтобы не путаться), можно было получить как можно больше точек из входного набора
0
1911 / 773 / 108
Регистрация: 01.10.2012
Сообщений: 4,200
23.09.2013, 17:54 12
Цитата Сообщение от DarthLenin Посмотреть сообщение
Еще раз сформулирую: нужно найти такую точку, чтобы изменением ровно d координат (раз уж упомянул, будем говорить более обощенно, чтобы не путаться), можно было получить как можно больше точек из входного набора
А что есть "изменение ровно d координат"? Это шаг величиной d по одной из осей? Напр d = 1, точки (5, 5, 1)(5, 5, 2)(5, 5, 3) считаются, каждая точка имеет минимум 2 годных соседей. Тогда кстраивает предыдущее решение. Все это мне напоминпет воксели
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 24
23.09.2013, 18:02  [ТС] 13
Цитата Сообщение от Igor3D Посмотреть сообщение
А что есть "изменение ровно d координат"? Это шаг величиной d по одной из осей?
Нет, это шаг произвольной длины по d осям
Например, из (5, 5, 1) можно получить (5, 5, 3) изменив одну координату (третью). Тут d=1. Например, между (5,5,1) и (5,3,2) d=2
0
1911 / 773 / 108
Регистрация: 01.10.2012
Сообщений: 4,200
23.09.2013, 18:14 14
Цитата Сообщение от DarthLenin Посмотреть сообщение
Нет, это шаг произвольной длины по d осям
Например, из (5, 5, 1) можно получить (5, 5, 3) изменив одну координату (третью). Тут d=1. Например, между (5,5,1) и (5,3,2) d=2
То есть средняя точка имеет минимум 2 соседей, крайние - минимум 1. Все равно устраивает предыдущее решение
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 24
23.09.2013, 18:22  [ТС] 15
Она может иметь больше 2 соседей, может вообще не иметь соседей, главное, чтобы все точки различались ровно в одних и тех же координатах.
Например, точки 0,0,1 0,0,2 0,0,3 0,0,4 все являются соседними друг другу т.к. любую из них можно получить изменением 1 координаты в любой другой. Возможно я просто не понимаю то, что вы хотите сказать. Если вы считаете, что ваш алгоритм работает, то не могли бы вы показать конкретные шаги на датасете который я писал выше. Напишу еще раз - 1,3,3 2,1,3 3,3,3 1,0,2 1,2,2 0,1,3.
0
1911 / 773 / 108
Регистрация: 01.10.2012
Сообщений: 4,200
23.09.2013, 19:46 16
(1,3,3) (2,1,3) (3,3,3) (1,0,2) (1,2,2) (0,1,3)

Сортируем по x, y, z
(0,1,3) (1,0,2) (1,2,2) (1,3,3) (2,1,3) (3,3,3) - никакие 2 точки не лежат на оси Z

Сортируем по y, z, x
(1,0,2) (0,1,3) (2,1,3) (1,2,2) (1,3,3) (3,3,3) - 2 группы лежат на оси X (x, 1, 3) + (x, 3, 3)

Сортируем по z, x, y
(1,0,2) (1,2,2) (0,1,3) (2,1,3) (1,3,3) (3,3,3) - 1 группа лежит на оси Y (1, y, 2)

Дальше отсеиваете группы по правилам как хотите. Напр если шаг между соседями 1, то ответ "пусто". Просчитав группу запоминаете результат в счетчикаx точки. Расчет по 1 оси не влияет на расчет по другой
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 24
23.09.2013, 20:25  [ТС] 17
Что вы понимаете под шагом между соседями? Число координат в которых точки различны? Давайте определим, что сосед порядка d - это точка, которая может быть получена из текущей изменением d координат (неважно на какое число). При этом, при подсчете числа соседей учитываются только точки из данного на входе multiset, но точка относительно которой они считаются может быть произвольной. В этом случае, при d=1 у нас есть 2 точки дающие максимальное число соседей 1 порядка. Это точки 3,1,3 и 1,1,3. Они обе имеют по 3 соседа 1 порядка. Пустое множество вообще не может быть ответом никогда, если входное множество непусто.
0
1911 / 773 / 108
Регистрация: 01.10.2012
Сообщений: 4,200
24.09.2013, 09:52 18
Цитата Сообщение от DarthLenin Посмотреть сообщение
Что вы понимаете под шагом между соседями? Число координат в которых точки различны? Давайте определим, что сосед порядка d - это точка, которая может быть получена из текущей изменением d координат (неважно на какое число).
Я понял координатЫ (именно одной). А оказывается любого числа координат (от 1 до k) но строго на одно число. Напр (0, 0, 0) и (1, 1, 1) - соседи (если d = 1). Также искомая точка может и не входить в исходное множество. Теперь все правильно?
0
834 / 642 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
24.09.2013, 10:13 19
Цитата Сообщение от Igor3D Посмотреть сообщение
Напр (0, 0, 0) и (1, 1, 1) - соседи (если d = 1).
Нет...
0
0 / 0 / 0
Регистрация: 22.09.2013
Сообщений: 24
24.09.2013, 21:19  [ТС] 20
Цитата Сообщение от Igor3D Посмотреть сообщение
Я понял координатЫ (именно одной). А оказывается любого числа координат (от 1 до k) но строго на одно число. Напр (0, 0, 0) и (1, 1, 1) - соседи (если d = 1). Также искомая точка может и не входить в исходное множество. Теперь все правильно?
Нет, они различаются в трех координатах. Они были бы соседями только при d >= 3
Например, (0, 0, 0) и (0, 0, 500) - соседи при d=1
0
24.09.2013, 21:19
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2013, 21:19
Помогаю со студенческими работами здесь

Построить окружности в 3-х мерном пространстве.
Как построить круги в трехмерной проекции, первый круг радиусом 10 сплошной линией, через 2 вверх...

Две точки в n-мерном пространстве X=(х1, х2, ..., хn), Y=(y1, y2, ...,yn)
Даны две точки в n-мерном пространстве X=(х1, х2, ..., хn), Y=(y1, y2, ...,yn). Написать программу...

Класс вектор в n-мерном пространстве
Есть задача: Разработать класс “вектор в n-мерном пространстве”. Определить: • конструктор (или...

Задача на векторы в в н-мерном пространстве
Здравствуйте. Задали вот задачку в универе, а знаний чтоб её решить нету ) Надо сделать класс,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru