找到最接近2D平面中每个点的三个点

时间:2012-01-16 17:50:45

标签: algorithm computational-geometry

您将获得飞机上的点列表,编写一个程序 输出每个点以及最接近的其他三个点 它。这三点按距离排序。

例如,给定一组点,其中每一行的形式为:ID x坐标y坐标

1 0.0 0.0  
2 10.1 -10.1   
3 -12.2 12.2   
4 38.3 38.3   
5 79.99 179.99  

你的程序应输出:

1 2,3,4   
2 1,3,4   
3 1,2,4   
4 1,2,3   
5 4,3,1  

这是我在在线论坛上发现的一个面试问题。我可以想到一个O(n * n)解决方案:计算每个点到每个其他点的距离。返回此点的最小距离点。对其他点重复此过程

2 个答案:

答案 0 :(得分:4)

您可能希望查看空间数据结构,例如k-d树或四叉树,这为最近邻搜索提供了出色的预期时间保证。例如,在执行O(n log n)预处理工作之后,k-d树可以在O(n)最坏情况时间和O(sqrt N)预期时间内进行最近邻搜索。

或者,如果您知道这些点大部分是随机分布的,您可以考虑将空间划分为一些固定大小的存储区集合。要找到一个点的最近邻居,你可以查看同一个桶中的所有点,然后查看附近桶中的所有点等。如果点很好,那么应该接近每点O(n / b)的时间。分布式,有b桶。

希望这有帮助!

答案 1 :(得分:3)

他们正在寻找的是,如果您听说过Delaunay triangulation,那么会导致O( n log n )算法。

修改的。根据评论中的更正,它并不像我暗示的那么简单。 一个可以使用Delaunay三角剖分来找到O( n log n )时间内的三个最近邻居, 但它需要一些工作,如Dickerson,Drysdale和Sack在论文中所解释的那样, “Simple Algorithms for Enumerating Interpoint Distances and Finding k Nearest Neighbors”。