【问题标题】:Find two points in a given set of points in 2D plane with least distance in less than O(n^2) time在小于 O(n^2) 时间的 2D 平面中找到距离最短的一组给定点中的两个点
【发布时间】:2012-09-05 14:35:46
【问题描述】:

我在雅虎被问到机器学习简介这个问题。给定一组点 (x,y) 坐标,我被要求在 O(n) 或 O(log n ) 时间内找到距离最短的点。 显然我能够想出 O(n^2) 时间,但离获得更好的算法还差得很远。尽管问题陈述是分而治之,但我还是想不出合并步骤的理由。我也在网上搜索了这个问题,发现它实际上很受欢迎,但我仍然无法掌握合并步骤的推理。

谁能帮我解决这个问题?

输入:(x1,y1),(x2,y2),(x3,y3),(x4,y4),(x5,y5)

【问题讨论】:

  • 这应该张贴在数学部分;) O(n) 表示与点数成线性关系。那可能吗?您刚刚比较了每一对点对吗?
  • 是的,在 O(n^2) 算法中我做到了 n*(n-1)/2 复杂度
  • 也许这会有所帮助:en.wikipedia.org/wiki/K-d_tree

标签: performance algorithm data-structures time-complexity


【解决方案1】:

使用递归分治法可以在 O(n log n) 时间内解决该问题,例如,如下:

1.根据x坐标对点进行排序。

2. 用一条垂直线 x=xmid 将一组点分成两个大小相等的子集。

3.在左右子集中递归求解问题。这将分别得出左侧和右侧的最小距离 dLmin 和 dRmin。

4.求一对点之间的最小距离dLRmin,其中一个点在分界线的左边,第二个点在右边。

5.最终的答案是dLmin、dRmin、dLRmin中的最小值。

http://en.wikipedia.org/wiki/Closest_pair_of_points

【讨论】:

  • 是的,令人惊讶的是,递归算法的“中间”部分是 O(1),因为您只需要在中间两点的每一侧最多检查三个点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多