LINUX.ORG.RU

Нахождение ближайших соседей (помогите выбрать алгоритм)

 


0

1

Да, да, я знаю. Не в первый раз тут спрашивают.

Но..

Гуглю второй день. Куча алгоритмов. Одни не подходят под задачу совсем. В описаниях других не полностью раскрываются возможности и ограничения. Не могу понять какой именно алгоритм выбрать. Ссылок? Их было сотни, в голове уже винигрет.

Просто объясню условия.

Есть множество точек в пространстве. Для каждой точки необходимо найти ближайших соседей.

Соседей может быть любое кол-во. Состояние «ни одного соседа» может случится только в случае если у нас всего одна точка.

Никакого ограничения «радиуса» поиска соседей нет, т.е. для одного случая это будет близко, а для другого в десятки или даже сотни раз больше.

Ограничением является только расположение соседей, т.е. например, для двумерного пространства, соседи будут являться вершинами (обязательно выпуклого) N-угольника минимальной площади.

Кстати, для случая когда будет только две соседних точки, N-угольник уже не получится, естественно.

Посоветуйте: какой алгоритм мне нужен?

Или ты задачу не до конца объяснил или тебя научить как расстояние между двумя точками считать?

four_str_sam
()
Ответ на: комментарий от four_str_sam

Дядьки с седыми бородами, полагаю, давно придумали какой-то максимально эффективный алгоритм для решения моей задачи.

А ты, кажется, предлагаешь мне сочинить велосипед с решением в лоб с полным перебором. Или нет?

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 1)

Для каждой точки необходимо найти ближайших соседей.

Сколько-то ближайших? Или в определённом радиусе?

monk ★★★★★
()
Ответ на: комментарий от deep-purple

Ограничением является только расположение соседей, т.е. например, для двумерного пространства, соседи будут являться вершинами (обязательно выпуклого) N-угольника минимальной площади.

исходная точка при этом где должна находиться? лежать внутри N-угольника, на грани, являться вершиной?

если минимальной площади то это всегда будет треугольник...

drsm ★★
()
Ответ на: комментарий от drsm

Внутри. Треугольник? Верное утверждение! Меня это устраивает!

deep-purple ★★★★★
() автор топика

судя по постановке задачи - читать про кластерный анализ

bass ★★★★★
()

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

При этом замечу что треугольник минимальной площади на случайном наборе точек с большой вероятностью получится с длинным основанием и минимальной высотой (три точки, «почти» лежащие на одной прямой), расположен он будет черт те как, и при этом будет ближайшим для большого количества точек, не смотря на то что расстояние до его вершин будет большим. Поэтому, с одной стороны, поиск его вершин не получится ограничить какой-то окрестностью, и честно это решается за N³logN (N базовых точек, для каждой 2 вершины ищутся перебором, 3-я ищется максимально близко к получившейся из первых двух прямой, можно за логарифм, с другой можно просто найти K треугольников минимальной площади за N²logN и выбрать для каждой вершины наиболее удовлетворяющий условию (ближайший * минимальной площади).

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

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)

Если у тебя есть один набор точек, по которому надо сделать многократный поиск, то сортируешь весь набор по одной координате. Перебираешь массив в стороны от целевой точки до тех пор, пока не найдешь нужное количество ближайших. Как правило тебе не понадобится перебирать весь массив, а только ближайшую группу. O(N*logN) на сортировку и O(N) на поиск, в надежде, что O(N) выродится в нечто гораздо меньшее.

Если в каждом поиске массив новый, то перебирать весь массив. Хочешь - не хочешь, а здесь O(N).

anto215 ★★
()

Ограничением является только расположение соседей, т.е. например, для двумерного пространства, соседи будут являться вершинами (обязательно выпуклого) N-угольника минимальной площади.

А если на плоскости 3 точки находятся на одной прямой (или близко к тому), но в разных концах пространства, то эта группа - ближайшие соседи?

Или применительно к 3-мерному пространству 4 точки находятся в одной плоскости и задают минимальный объем, то эта группа - ближайшие соседи?

Если так, то это NP проблема. Я так думаю.

anto215 ★★
()
Ответ на: комментарий от deep-purple

Прочитай внимательно все что я написал в топике. Там все написано.

Ой-ли...

Ограничением является только расположение соседей, т.е. например, для двумерного пространства, соседи будут являться вершинами (обязательно выпуклого) N-угольника минимальной площади.

Из этого определения следует, что нам надо найти ОДИН треугольник минимальной площади, и образующие его точки будут являться ближайшими соседями (согласно Вашему определению) для ВСЕХ точек. Вы правда хотите именно этого?

Определитесь для начала с постановкой.

AIv ★★★★★
()

Я могу рассуждать только теоретически. Эффективного алгоритма в отрыве от специальной структуры данных не получить. Поэтому будет больно. Конвертация в структуру данных, обновление, проверка корректности и прочие радости тебе обеспечены. В качестве структуры данных рекомендуется R-дерево.

iVS ★★★★★
()

Прочитав по диагонали думается что для двумерного случая диаграммы вороного спасут тс. Иди будут отправной точкой

MKuznetsov ★★★★★
()

треугольники, выпуклые многоугольники... чушь какая-то

прямоугольники — в декартовой системе координат — твой выбор

* отсортируй массив точек по x
* отсортируй массив точек по y
* выбери «характерный размер соседства» d
* пусть твоя рассматриваемая точка (x0,y0)
* в окне области ограниченном (x0-d/2,y0-d/2) ... (x0+d/2,y0+d/2) ищи /можно перебором/ пары координат принадлежащие одной точке
* если точек слишком много — уменьши «характерный размер соседства» d

если координаты полярные — оперируй, соответстсенно, r и alpha

select X,Y from PLOTS where X>(x0-d/2) and X<(x0+d/2) and Y>(y0-d/2) and Y<(y0+d/2) order by X;

anonymous
()

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

Ты как то неправильно используешь слово «ближайший», не факт что вершины многоугольника с минимальной площадью будут располагаться на минимальном расстоянии.

ya-betmen ★★★★★
()

Вот.

bass, slovazap, anto215, AIv, iVS, MKuznetsov, psv1967, ya-betmen и Анон:

Я тут успел переехать, сгореть до волдырей и поставить душевую кабину.

Но к делу.

Теперь почитал еще инфы про всякого что вы все писали выше.
Пришел к выводу что, да, мне нужны диаграмма вороного или триангуляция делоне (оно даже ближе «визуально») как отправная точка.
Дальше пока ничего еще не думал, но из той инфы что есть уже будет веселее.
Задачу помечаю как решенную.
Хотя оно и не до конца.
Если что кастану спросить в эту тему или сами чего вспомните/посоветуете.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Строите диаграмму Вороного, выбираете соседние (имеющие общие грани) точки. В чем проблема?

AIv ★★★★★
()
Ответ на: комментарий от AIv

Мне не нужны грани, мне нужны «связи» как в триангуляции делоне. Пилю делоне. Да, я вычитал что вороного можно превратить в делоне. Но зачем? Это будет уже лишнее промежуточное преобразование. Ну или если будет время я потом вороного запрягу и сравню кто у меня лучше поскачет на живых данных — вороной или делоне.

deep-purple ★★★★★
() автор топика
Последнее исправление: deep-purple (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.