Эффективный алгоритм работы с файлами сети больших данных для вычисления n ближайших узлов

Проблема: у меня есть два сетевых файла (скажем, NET1 и NET2) - каждый имеет набор узлов с уникальным идентификатором для каждого узла и географическими координатами X и Y. Каждый узел в NET2 должен иметь < em> n подключений к NET1 и ID n узлов будут определяться минимальным расстоянием по прямой линии. Выходные данные будут иметь три поля идентификатора узла в NET1, NET2 и расстояние между ними. Все файлы имеют формат с разделителями табуляции.

Один путь вперед… Один из способов реализовать это - для каждого узла в NET2 мы перебираем каждый узел в NET1 и вычисляем все комбинации расстояний NET1-NET2. Отсортируйте его по идентификатору узла NET2 и расстоянию и выпишите первые четыре записи для каждого узла. Но проблема в том, что около 2 миллионов узлов в NET1, 2000 узлов в NET2 - это 4 миллиарда расстояний, которые нужно вычислить и записать на первом шаге этого алгоритма ... и время выполнения совершенно недопустимо!

Запрос. Мне было любопытно, сталкивался ли кто-нибудь из вас с подобной проблемой. Я хотел бы услышать от вас обо всех алгоритмах и структурах данных, которые можно использовать для ускорения обработки. Я знаю, что объем этого вопроса очень широк, но я надеюсь, что кто-то сможет указать мне правильный путь, поскольку у меня очень ограниченный опыт оптимизации кодов для данных такого масштаба.

Языки: я пытаюсь использовать C ++, Python и R.

Пожалуйста, поделитесь идеями! Помощь очень признательна!


person sriramn    schedule 09.03.2013    source источник
comment
Это проблема поиска ближайшего соседа.   -  person Nikolay Polivanov    schedule 09.03.2013


Ответы (1)


kd-tree - один из вариантов. Это позволяет вам найти ближайшего соседа (или набор ближайших соседей) в разумные сроки. Конечно, сначала нужно построить дерево, и это займет некоторое время. Но в целом kd-tree подходит, если вам не нужно добавлять / удалять узлы во время выполнения, что, кажется, ваш случай. Он также имеет лучшую производительность с меньшим размером (в вашем случае размер равен 2).

Другой возможной структурой данных является октодерево (quadtree для 2D), это более простая структура данных (довольно легко реализовать), но kd-tree может быть более эффективным.

person Jaa-c    schedule 09.03.2013
comment
Вы знаете какую-нибудь хорошую реализацию этой структуры данных на Python или C ++? - person sriramn; 09.03.2013
comment
В C ++ я слышал об этом code.google.com/p/kdtree и libkdtree.alioth.debian.org, но на самом деле не использовал их, поэтому не знаю об эффективности. .. - person Jaa-c; 09.03.2013