Closest Pair of Points(平面最近点对)
给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小。
1. 暴力轮循
直接计算每两个点之间的距离,然后就可以确定距离最小的两个点。其时间复杂度为 O(n*2)
2. 分治法
基本思路是将点集合平均分为两份,分别计算两个子集合中的最近点对。此方法重点在于分治算法的合并过程,即最近点对分别存在于两个集合中。其时间复杂度是 O(nlogn) ,具体算法步骤如下:
- 对所有点从小到大排序,以 x 为第一关键词,y 为第二关键字;
- 将所有点按 x = mid 坐标分成左右两部分;
- 递归求解左右两部分中的最近距离,并取最小值min_d = min{min_left,min_right};
- 以 x = mid 划分 x = mid - min_d 和 x = mid + min_d 的区域,则若最近点对分别存在于两个集合中,必须在此范围内;
1)其中对于在 [mid - min_d, mid] 的点 p(x_p, y_p),不需要与所有 [mid, mid + min_d] 的点计算距离,而是 x in [mid, mid + min_d], y in [y_p - min_d, y_p + min_d] 范围内的点计算即可。
主要时间复杂度是排序的时间复杂度,即 O(nlogn),具体实现过程如下:
1 | import math |