这是一个简单的想法。(聚类方法)
根据 x,y 值将您的动物放在一个网格中。如果您不想检测到错误的异常值,您可以使用两个网格。在这个例子中,我使用了两个用黑色和蓝色线条表示的网格容器。
异常值定义为:an animals which is alone in both it's blue and black grid.
您保留网格索引和网格中包含的动物之间的引用。
迭代动物并使用它们的 x,y 值将它们放入网格中。然后迭代黑色网格。当网格内容为 1 时,通过黑色网格内的动物找到蓝色网格参考。检查蓝色网格的内容。如果为 1,则该动物为异常值。
运行时间应该很快。
n: number of animals
b: size of black grid
把动物放在格子里O(n)
。迭代黑色网格是O(b)
这O(n) + O(b)
总共提供了构建信息和定位异常值。
定位异常值需要O(b)
时间。如果您的网格足够小,这将确保非常快的运行时间。
上图应说明两个异常值。
实现应该相对简单。您可以使用基于网格的策略变体,使用不同的网格布局或使用更多的网格容器。
编辑:
这种方法与本文中描述的不计算距离的单元格方法有些相关。http://www.slac.stanford.edu/cgi-wrap/getdoc/slac-r-186.pdf
此方法不会排除所有案例的错误检测异常值。要获得更完美的解决方案(对于地图上所有可能的动物位置),您必须添加从一个单元格中检测到的 1 个动物到相邻单元格内容的距离计算。你可以在这里阅读更多关于它的信息。