最近点对
问题描述
给定平面上 个点的集合 ,找其中的一对点使得在 个点组成的所有点对中,该点对间的距离最小。
问题分析
简单情形:一维数轴
为了使问题易于理解和分析,先来考虑一维的情形。此时 中的 个点退化为 轴上的 个实数 。最接近点对即为这 个实数中相差最小的 2 个实数。
假设用 轴上某个点 将 划分为小于 的子集 和大于 的子集 。基于平衡子问题的思想,用 中各点坐标的中位数来作分割点。在 中找出其最近点对 ,在 中找出其最近点对 。于是最短距离分别为
递归地, 中的最近点对要么是 ,要么是 ,要么是某个点对 ,其中 且 。从而用线性时间就可以将 的解和 的解合并成为 的解。
复杂情形:二维平面
选取一垂直线 来作为分割直线。其中 为 中各点 坐标的中位数。由此将 分割为 和 两个半平面。
递归地在 和 上找出其最小距离 和 并设 。 中的最接近点对要么是 ,要么是某个 ,其中 且 。如图所示:
对于点 ,需要考察 中的各个点和点 之间的距离是否小于 。显然 中这样点的 轴坐标一定位于区间 之间,而且,这样的点不会超过 6 个。
快速检查 6 个点的方法
- 将 和 中所有 中点按其 坐标排好序(预处理)。
- 对 中所有点,对排好序的点列作一次扫描。
- 对 中每一点最多只要检查 中排好序的相继 6 个点。
算法分析
一维简单情形和二维情形的时间复杂度均为