点的定义
#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];}
优化部分
- 减少分割次数
- 使用平面扫描法减少计算量
- 提前终止递归