你如何有效地计算大型重叠组?

时间:2017-03-17 00:58:20

标签: algorithm data-structures bigdata

我有2个非常大的鸟群,它们在X英里半径的圆圈中飞行,每个圆圈都有一个跟踪器,所以我可以确定它们在任何给定时刻的位置。这两个cirlces中有一部分重叠(类似于维恩图的样子)。

由于这些是鸟类,在任何时间点,鸟A(在圆圈1中)可能是在重叠区域中,也可能是随机的。

我想定期计算交叉路口的鸟类并确定它们是什么鸟类。

我遇到的问题是为此确定正确的数据结构。我曾考虑使用Bloom过滤器,但它不允许删除(鸟移出重叠)并且内存密集。

我对任何想法持开放态度(在Redis中存储数据以便读取等)。

1 个答案:

答案 0 :(得分:1)

如果圆圈具有固定的中心和半径,当您收到位置时,您可以判断该位置是否在重叠中(例如,如果到每个中心的距离小于半径)。所以你的问题是维护一个集合,从中删除和插入项目。我要尝试的第一件事就是完全普通的数据库,或内存中的HashSet。

如果Redis适合你,那么最简单的方法就是当一只鸟在重叠时创建一个密钥,而当它没有时删除它。这允许您测试是否有任何鸟在重叠,但不能有效地读出哪些鸟在其中。当一只鸟被插入并且之前没有重叠时,你当然可以增加一个计数器,当一只鸟移出重叠时你可以递减它,以保持重叠中鸟类的运行数量。

在我看来,您可以使用Redis排序集来维持重叠中的一组鸟 - 请参阅例如ZRANGE,ZADD,ZREM。如果你达到了某种限制,你可以为每只鸟存储一条记录,其中包含与其他鸟类记录的下一个和上一个链接,并在重叠区域中构建一个双向链接的鸟类列表 - 使用Redis或任何键值让你信任。

相关问题