Я исследовал метод с использованием мини-кучи. Для каждой точки мы можем сохранить минимальную кучу размера k, но для большого n (I m таргетинга для n около 100 миллионов) требуется слишком много места. Разумеется, должен быть лучший способ сделать это, используя меньшее пространство и не сильно влияя на временную сложность. Есть ли другая структура данных?Учитывая n точек в двумерной плоскости, мы должны найти k ближайших соседей каждой точки между собой
Учитывая n точек в двумерной плоскости, мы должны найти k ближайших соседей каждой точки между собой
ответ
Эта проблема типична для KD-tree. Такое решение будет иметь линейную сложность, но может быть относительно сложным для реализации (если готовая реализация недоступна)
Альтернативный подход может заключаться в использовании bucketing для уменьшения сложности наивного алгоритма. Идея состоит в том, чтобы разделить плоскость на «ведра», т. Е. Квадраты некоторого размера и поместить точки в ведро, к которому они принадлежат. Ближайшие точки будут от ближайших ковшей. В случае случайных данных это может быть довольно хорошим улучшением, но худший случай все тот же, что и наивный подход.
Я узнаю о KD-Tree. Также подход к балансировке кажется довольно хорошим. Какая структура данных, по вашему мнению, подходит для ее реализации? Я думаю, что первый поиск по графу с краями, представляющими смежность между ведрами (узлами) в 2D-плоскости, был бы неплохим. – nighthowler
Для реализации я предполагаю, что вы можете использовать либо матрицу 2d с ячейкой для каждого ведра, либо хэш-таблицу (или какой-либо другой ассоциативный массив), если вы ожидаете, что большинство ведер будет пустым –
- 1. Найти все k-ближайших соседей
- 2. Найти K ближайших соседей
- 3. Найти два ближайших соседей точек
- 4. Найти ближайших соседей - OpenCV
- 5. Поиск ближайших соседей K
- 6. Все k ближайших соседей в 2D, C++
- 7. Как эффективно найти k-ближайших соседей в высокоразмерных данных?
- 8. Поиск геометрического центра n точек на двумерной плоскости - расстояние Манхэттена
- 9. Поиск трех точек, ближайших к каждой точке в 2D-плоскости
- 10. R: классификация k-ближайших соседей
- 11. ближайших k соседей, удовлетворяющих условиям (python)
- 12. Непрерывная модификация множества точек - найти всех ближайших соседей
- 13. count ближайших соседей для каждой точки в матрице в matlab
- 14. Проблема с sklearn k ближайших соседей
- 15. K-ближайших соседей OpenCV алгоритм
- 16. K-ближайших соседей Запрос в PostGIS
- 17. Найти ближайших соседей в большом наборе
- 18. Как найти k ближайших соседей к медиане n различных чисел в O (n) времени?
- 19. Найти K ближайших точек к точке Р в 2-мерной плоскости
- 20. K Классификация ближайших соседей Особый случай с идентичными точками
- 21. Найти число связанных компонентов графика k-ближайших соседей?
- 22. Параллельный алгоритм для поиска ближайших точек K
- 23. нахождение 3 ближайших точек на плоскости
- 24. Обнаружение аномалий с использованием ближайших соседей K?
- 25. Как мне пересечь KDTree, чтобы найти k ближайших соседей?
- 26. Как эффективно найти k ближайших соседей из дерева kd
- 27. Как найти всех взаимоисключающих ближайших соседей между двумя массивами
- 28. минимизировать общее расстояние, K ссылки для каждого из N точек на плоскости
- 29. Найти k ближайших точек в большом количестве баллов
- 30. Испытание, если точки лежат на двумерной плоскости в 4D
Как большое значение ** n ** влияет на «большое пространство» - размер кучи составляет ** k **? Вы считали https://en.wikipedia.org/wiki/K-d_tree для вашего размера набора данных? – MBo
Я думаю, что meta рассматривает один minheap для каждой точки. Таким образом, была бы полная «n» min-heap с размером 'k', таким образом, занимая пространство« n * k »в целом. –
@SauravSahu Да, я так и думал об этом. – nighthowler