В настоящее время я заинтересован в генерации случайных геометрических графов. Для моей конкретной задачи мы произвольно размещаем узел v в единичном квадрате и добавляем ребро от v к узлу u, если они имеют Euclidean distance < = D, где D = D (u, n) изменяется с u и количеством узлов n на графике.Эффективно проверяется, какая из большого набора узлов близка?
Важные моменты:
Это дорого для вычисления D, поэтому я хотел бы, чтобы минимизировать количество вызовов этой функции.
Подавляющее большинство времени, когда добавлено v, грани uv будут добавлены только к небольшому числу узлов u (обычно 0 или 1).
Вопрос: Что представляет собой эффективный метод для проверки, какие вершины у являются «достаточно близко» к V?
Алгоритм грубой силы заключается в вычислении и сравнении dist (v, u) и D (u, n) для всех существующих узлов u. Для этого требуется O (n) звонки D.
Я чувствую, что мы сможем сделать намного лучше этого. Возможно, какой-то битнинг будет работать. Мы могли бы разделить пространство на бункеры, затем для каждой вершины u, мы сохраняем список ящиков, где вновь размещенная вершина v может привести к краю uv. Если v заканчивается помещением вне списка бункеров (что должно происходить в большинстве случаев), то оно слишком далеко, и нам не нужно вычислять D. Это несколько несовместимо, предложение моей головы, и я не знаю, будет ли это работать хорошо (например, накладные расходы при вычислении достаточно близких бункеров, что может быть слишком дорогостоящим), поэтому я получаю обратную связь.
Что вы подразумеваете под "close enough"? Вы хотите найти k-ближайших соседей? –
Нет, я имею в виду, когда мы размещаем v, мы ищем вершины u, для которых v попадает в «круг влияния». Радиус круга варьируется от вершины до вершины, с размером графика и с несколькими определяемыми пользователем параметрами. –
Можете ли вы сказать больше о функции 'D'? Если я правильно понимаю, вы вставляете узел 'v' и должны проверять' D (u, n) 'для каждой другой вершины' u'. Если 'D' является черным ящиком для вас, вам действительно нужно проверить все вершины. Поскольку вы хотите быть умнее, по-видимому, 'D' вовсе не является черным ящиком ... –