点的定义
#import @interface Point : NSObject {@property (nonatomic, assign) double x;@property (nonatomic, assign) double y;}
预处理步骤
- 将所有点按照横坐标进行排序
- 从中选出一部分点作为递归分治的子问题
- 递归处理左右子问题,然后合并结果
递归函数实现
+(NSArray *)closestPairOfPoints:(NSArray *)points {
// 基线情况 if (points.count <= 3) { return [self bruteForce(points)]; }
// 分割点集 Point *midPoint = [points[points.count/2]]; NSArray *leftPoints = [self splitPoints:points[0...midPoint]; NSArray *rightPoints = [self splitPoints:points[midPoint...-1]];
// 递归求解左右子问题 NSArray *leftPair = [self closestPairOfPoints:leftPoints]; NSArray *rightPair = [self closestPairOfPoints:rightPoints];
// 合并结果 if ([leftPair distanceTo:rightPair] < [self distanceToPoints:leftPoints rightPoints]) { return leftPair; } else { return rightPair; } }
// 分割点集 -(NSArray *)splitPoints:(NSArray *)points { return [self sortedPointsByX:points]; }
优化部分
- 减少分割次数
- 使用平面扫描法减少计算量
- 提前终止递归