从给定的n个点中选择最接近的k点

时间:2011-03-30 21:16:54

标签: algorithm language-agnostic geometry computational-geometry

你在平面上给出了一组n个n点,你可以在恒定时间内计算任意一对点之间的距离。选择一个名为C的U的子集,使得C中恰好有k个点,并且C中最远的2个点之间的距离对于给定的k尽可能小。 1< k< = n

除了明显的n-choose-k解决方案之外,最快的方法是什么?

6 个答案:

答案 0 :(得分:10)

解决方案见Finding k points with minimum diameter and related problems - Aggarwal,1991。 其中描述的算法具有运行时间:O(k^2.5 n log k + n log n)

对于无法访问该论文的人: 这个问题被称为 k-diameter ,并被定义为

  

找到一组最小直径的 k 点。集合的直径是集合中任何点之间的最大距离。

我无法真正对所提出的算法给出概述,但它包括计算点的(3k - 3)阶Voronoi图,然后求解每个 O(kn) Voronoi集的问题(通过计算某些二分图中的最大独立集)...我想我想说的是,这是非常重要的,并且远远超出了采访和本网站:-)

答案 1 :(得分:9)

由于这是一个面试问题,这里是我的解决方案。 (正如dcn指出的那样,这不能保证返回最佳解决方案,尽管它应该仍然是一个不错的启发式。好的捕获,直接!)

  1. 使用单个点P
  2. 创建一个S p
  3. 计算S p 中每个点与其外部每个点之间的距离,然后将最小距离最小的点添加到S p
  4. 重复2.直到S p 有k个点。
  5. 使用每个点作为初始P重复1-3次。获取具有最小最大距离的S p
  6. 在S p 中有O(k)个点,并且O(n)点在其外部,因此找到具有最小最大距离的点是O(nk)。我们重复这个k次,然后重复整个过程n次,总的复杂度为 O(n 2 k 2

    我们可以通过缓存S p 任何点与S p 之外的每个点之间的最大距离来改进。如果maxDistanceFromPointInS[pointOutsideS]是一个O(1)哈希表,其中包含每个点pointOutsideS与S p 内某个点之间的当前最大距离,那么每次我们添加新点newPoint,我们为S p 之外的所有点maxDistanceFromPointInS[p] = Max(maxDistanceFromPointInS[p], distance(newPoint, p))设置p。然后找到最小的最大距离是O(n),向S p 添加一个点是O(n)。重复该k次给出O((n + n)k)= O(nk)。最后,我们重复整个过程n次,总体复杂度为 O(n 2 k)

    我们可以使用堆来改善找到与O(1)的最小最大距离,但这不会改变整体复杂性。


    顺便说一句,写这篇文章花了一个小时 - 在面试中我无法做到这一点。

答案 2 :(得分:1)

这仍然是一个混乱的想法,我不确定它是否真的有效它不起作用。在这里为后人留下错误的答案。

For each point in U
    make a list of the distance to each point in U
    sort the list
    add largest distance to a max-heap.
while any of the lists have more than k elements
    remove max of heap twice
    remove corresponding elements from the two lists they came from
    add the two newly exposed largest elements from those two lists to the heap
Any of the lists left with k elements will list the elements in C

基本上,找到两个当前看起来可能同时在子集中并且具有最大成对距离的点,然后排除它们两者在一起的子集中。重复,直到你只剩下一种可能的方式形成一个k大小的子集。

这应该是时间复杂度O((n ^ 2)log(n))和空间复杂度O(n ^ 2)。

答案 3 :(得分:0)

deterministic polynomial time显然是可行的。

但我不明白他们的算法。看来他们选择的圈子总是输入点之一。有人可以对此有所了解或整齐地解释他们做了什么(只是第2节就足够了)?

答案 4 :(得分:0)

提出的实际问题似乎很难。如果这些点不在平面内且具有任意距离,则通过从k-clique减少将是NP难的(采用任意未加权的图形,并且为缺失边缘添加长度无穷大的边缘,并且对于现有边缘添加长度为1的边缘 - 只要“最近的k点”的最大相互距离为1而不是无穷大,就存在大小为k的团。然而,由于这些点被限制在平面中以便禁止这样的距离标记,因此可能存在解决方案。至少,似乎可以近似接近。

如果您的采访意味着'最小直径圆圈包围k点',那么以下可能是您在面试中可以合理提出的最快的正确算法:

对于每组3的大小,计算包含这些点的最小圆,并检查每个点是否包含在此圆中。如果包含的数字至少为k,则相应地更新最小直径。

本质上,这是一个四重嵌套for循环,因此运行时间为O(n ^ 4)。

答案 5 :(得分:-2)

如果您没有太多的异常值,这应该是一个很好的近似解决方案

p = mean center (average x, y) of U
M = U sorted by distance to p
C = M[0:k]