我有 N 移动设备/节点(比如100K),我会定期获取它们的位置(纬度,经度)值。
某些设备与大概 M 其他设备(比如10)“逻辑连接”。 我的程序会定期比较每个设备与其逻辑连接设备之间的距离,并确定距离是否在阈值(例如100米)内。
我需要一个强大的算法来计算到逻辑连接设备的这些距离。
强力逼近方法的复杂度顺序为N * M或Θ(N2)
程序每隔3秒执行一次(所有设备都是移动设备),因此每3秒100K * 10 = 3M计算效果不佳。
此操作的任何好/经典算法?
答案 0 :(得分:1)
(为了简化我的解释,我省略了每个设备的详细信息,只是逻辑上连接到M~ = 10个其他设备。)
空间划分您的设备位置。如果您只对相距不到100米的设备感兴趣,请考虑以下两种算法。
对于i = 1..N,j = 1..N,i!= j,计算设备i和j之间的距离。
对于i = 1..N,计算设备i的纬度和经度所在的网格单元格,其中网格单元格为100平方米。现在对于所有非空的网格单元,将该单元中的设备仅与同一单元中的设备或八个相邻单元中的一个进行比较。
此方法的数据结构基本上是从网格单元索引(s,t)到该网格单元中的设备列表的映射M.
第一种方法是天真的并且将花费Θ(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"
答案 1 :(得分:0)
您可以使用四叉树或莫顿曲线。它减小了尺寸并使解决方案更容易。