2014-02-15 2 views
2

У меня есть N мобильных устройств/узлов (скажем, 100K), и я периодически получаю их значения местоположения (широта, долгота).Расчет расстояний для массивного количества устройств/узлов

Некоторые устройства «логически подключены» примерно до M другие устройства (скажем, 10). Моя программа периодически сравнивает расстояние между каждым устройством и его логически подключенными устройствами и определяет, находится ли расстояние в пределах порога (скажем, 100 метров).

Мне нужен надежный алгоритм для вычисления этих расстояний для логически подключенных устройств.

Сложность порядок грубой силы подход будет Н * М или Θ (N 2)

Программа делает это через каждые 3 секунды (все устройства являются мобильными), таким образом, 100K * 10 = расчеты 3M каждые 3 секунды является нехорошо.

Любые хорошие/классические алгоритмы для этой операции?

+0

Все устройства N меняются каждые 3 секунды? – odedsh

+0

Ну, есть ли другие предположения, которые можно рассмотреть? В противном случае, если ** каждая ** логически связанная пара также «достаточно близко», тогда вы должны сделать «грубую силу» в любом случае. –

+0

@odedsh Да, все N устройств могут изменять lat, длинные значения, перемещая их. Они также могут оставаться неподвижными, но здесь нет предположений. –

ответ

1

(Чтобы упростить мое объяснение, я опустил детали о каждом устройстве только быть логически связанным с М ~ = 10 других устройств.)

Пространственно разметить места вашего устройства. Если вас интересуют только пары устройств на расстоянии менее 100 метров, рассмотрите следующие два алгоритма.

  1. Для i = 1..N, j = 1..N, i! = J, вычислить расстояние между устройствами i и j.

  2. Для i = 1..N, вычислите ячейку сетки, где широта и долгота для устройства i находятся, где ячейки сетки составляют 100 метров. Теперь для всех непустых ячеек сетки сравните устройства в этой ячейке только с устройствами в одной и той же ячейке или одной из восьми соседних ячеек.

    Структура данных для этого подхода будет в основном представлять собой карту M из индекса ячейки сетки (s, t) в список устройств в этой ячейке сетки.

Первый подход наивный и будет стоить Q (N 2 ). Второй подход будет, если предположить, что существует некоторая «постоянная максимальная плотность устройств», быть ближе к Θ (N) на практике. Радиус 100 метров - довольно маленький.

Псевдокод для второго подхода выглядел бы следующим образом.

M = {} 

for i = 1..N 
    (s,t) = compute_grid_cell(i) 
    if ((s,t) not in M) 
    M[(s,t)] = [] 
    M[(s,t)].push(i) 

for i = 1..N 
    (s,t) = compute_grid_cell(i) 
    for s' in [s-1, s, s+1] 
    for t' in [t-1, t, t+1] 
     if (s',t') in M 
     for j in M[(s',t')] 
      if i != j and distance(i, j) < 100 
      report (i,j) as a pair of devices that are "close" 
+0

Хорошая идея. Как бы вы обращались, если расстояние для логического соединения также является переменной? То есть100 метров между (A, B, C) и 500 метров между (A, B, E, F, G). Извините, что не упоминал об этом раньше. Я отредактирую вопрос –

+0

, позвольте мне спросить, что в другом вопросе тогда. –

+0

@math_law Идем дальше и ссылаемся на следующий вопрос, чтобы они были связаны. –

0

Вы можете использовать квадранты или кривую morton. Это уменьшает размеры и облегчает решение.

+0

Когда известен радиус интереса (100 метров), на самом деле нет смысла использовать квадранты. –

+0

@TimothyShields: Вы можете уточнить? – Bytemain

+0

В этом приложении единственный вопрос, на который нужно ответить, - «Являются ли устройства i и j менее 100 метров друг от друга?» Квадтрия - очень универсальная структура данных и может быть абсолютно использована здесь, но нет мотивации. Правильная сетка из 100-метровых квадратных ячеек (представленная как карта от индекса ячейки к содержимому ячейки) уже является оптимальной с точки зрения требуемых операций. Квадтрит просто добавит излишнюю сложность. –

Смежные вопросы