#algorithm #data-structures #geometry #nearest-neighbor
#алгоритм #структуры данных #геометрия #ближайший сосед
Вопрос:
Я исследовал метод с использованием минимальной кучи. Для каждой точки мы можем хранить минимальную кучу размером k, но для больших n требуется слишком много места (я нацеливаюсь на n около 100 миллионов).). Конечно, должен быть лучший способ сделать это, используя меньшее пространство и не сильно влияя на временную сложность. Существует ли какая-либо другая структура данных?
Комментарии:
1. Насколько большое значение n влияет на «много места» — размер кучи равен k ? Вы рассматривали en.wikipedia.org/wiki/K-d_tree для вас размер набора данных?
2. Я думаю, что meta рассматривает один minheap для каждой точки. Таким образом, будет общая
n
минимальная куча с размеромk
, что займетn*k
всего места.3. @SauravSahu Да, я думал об этом именно так.
Ответ №1:
Эта проблема типична для KD-дерева. Такое решение будет иметь линеарифмическую сложность, но может быть относительно сложным для реализации (если готовая реализация недоступна)
Альтернативным подходом может быть использование bucketing для уменьшения сложности наивного алгоритма. Идея состоит в том, чтобы разделить плоскость на «сегменты», то есть квадраты определенного размера, и поместить точки в сегмент, к которому они принадлежат. Ближайшие точки будут из ближайших сегментов. В случае случайных данных это может быть неплохим улучшением, но наихудший случай остается таким же, как и при наивном подходе.
Комментарии:
1. Я узнаю о KD-дереве. Также подход bucketing кажется довольно хорошим. Какая структура данных, по вашему мнению, будет подходящей для ее реализации? Я думаю, что поиск по ширине в графе с ребрами, представляющими смежность между сегментами (узлами) в двумерной плоскости, был бы неплохим.
2. Для реализации, я полагаю, вы могли бы использовать либо 2d-матрицу с ячейкой для каждого сегмента, либо хеш-таблицу (или какой-либо другой ассоциативный массив), если вы ожидаете, что большинство сегментов будут пустыми