这个问题是对之前的SO问题的增强。
Distance Calculation for massive number of devices/nodes
我有N个移动设备/节点(比如100K),我会定期获取它们的位置(纬度,经度)值。
某些设备与大约M个其他设备“逻辑连接”(平均为10个)。我的程序会定期比较每个设备与其逻辑连接设备之间的距离,并确定距离是否在阈值(例如100米)内。
此外,逻辑连接“K”的数量也可以多于一个(平均为5个) 例子A可以连接到B,C,即“父母”逻辑。 A也可以连接到C,D,E,F用于“工作”逻辑
我需要一个强大的算法来计算到逻辑连接设备的这些距离。
蛮力方法的复杂性顺序为N M K或(按顺序为Θ3)
程序每隔3秒执行一次(所有设备都是移动设备),例如每3秒100K * 10 * 5 = 5M计算不好。
此操作的任何优秀/经典算法?
答案 0 :(得分:0)
您可以使用强力算法并对结果进行排序,然后使用最佳组。
答案 1 :(得分:0)
除了上一个问题的答案中建议的内容之外,您可以做的一件事是为每个设备存储附近连接设备的列表,并仅为那些自上次移动了很长距离的设备更新它更新(以及连接到已移动的设备)。
例如,如果阈值为100米,则在每台设备的200米范围内存储已连接设备的列表,并为自上次更新以来移动超过50米的每台设备更新。
答案 2 :(得分:0)
经过一番思考,我决定重写我的答案。
在最坏的情况下,问题的复杂性不是O(N ^ 3),在最坏的情况下实际上只有O(N ^ 2)。它也不是O(N * M * K)而是O(N *(M + K)),其中O(M + K)是O(N)。但是,问题的真正复杂性是O(E),其中E是逻辑连接的总数(工作连接数+父连接数)。除非您想要近似,否则您的解决方案不能比O(E)更好。您的平均值表明您可能拥有500万个连接,大约为O(N log N)。
您的示例使用两组逻辑连接。因此,您只需循环浏览每个集合,并检查逻辑连接的设备之间的距离是否在阈值范围内。
话虽如此,您提供的示例和您假设的时间复杂性表明您感兴趣的不仅仅是单个连接是否在阈值范围内,而是连接组是否在阈值范围内。具体来说,在你的例子中,如果父母逻辑:(A,B),(A,C)和工作逻辑(A,C),(A,D),(A,E),(A,F),它将返回True都是真的。在这种情况下,您最好的数据结构将是一个字典字典,在Python中如下所示(包括下面的优化): “parentsLogic [A] [B] =(最后一个位置A,最后一个位置B,在阈值范围内)”。
如果位置变化不大,通常可以通过存储先前的位置以及它们是否在阈值范围内(布尔值)来获得一些运行时间改进。好处是,如果两个位置没有改变,您可以简单地返回先前的结果,如果它们已经改变则更新它们。