给定一个平面上的点集 U,其中有 n 个点,您可以在常数时间内计算任意两点之间的距离。选出 U 的一个子集 C,使得 C 恰好包含 k 个点,并且 C 中最远的两点之间的距离对于给定的 k 最小。1 < k ≤ n
除了明显的 n-choose-k 解决方案,有什么更快的方法吗?
给定一个平面上的点集 U,其中有 n 个点,您可以在常数时间内计算任意两点之间的距离。选出 U 的一个子集 C,使得 C 恰好包含 k 个点,并且 C 中最远的两点之间的距离对于给定的 k 最小。1 < k ≤ n
除了明显的 n-choose-k 解决方案,有什么更快的方法吗?
一种解决方案在 《查找最小直径中的k个点及相关问题》 - Aggarwal, 1991 中展示。
所述算法的运行时间为: O(k^2.5 n log k + n log n)
对于那些无法访问论文的人:
称为 k-直径 的问题定义为: 查找一组具有最小直径的k个点。 集合的 直径 是集合中任意两个点之间的最大距离。
我无法真正地概述所提出的算法,但它包括计算点的 (3k-3)阶Voronoi图,然后在每个 O(kn) Voronoi 集中解决问题(通过计算一些二分图中的最大独立集)...我想我是在说它非常不平凡,远远超出了面试和此网站的范围 :-)
这仍然是一个混乱的想法,我不确定它是否真正可行它不起作用。将错误答案留在这里,供后人参考。
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
显然可以在确定性多项式时间内完成。
但我不理解他们的算法。似乎他们选择的圆总是输入点之一。有人能够解释一下或者简洁地解释一下他们在做什么吗(只需要第二部分)?
如果您没有太多异常值,这应该是一个很好的近似解决方案。
p = mean center (average x, y) of U
M = U sorted by distance to p
C = M[0:k]