算法分析分治法之最近点对问题
*分治法
将一个难以解决的问题,分成多个规模较小的问题逐个击破,并将解决的子问题进行合并得到母问题的解决方案。
最近点对问题
1.题目描述
给定二维平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小
2.输入描述
n
3.输出描述
最近点对距离,结果保留2位小数
4.输入样例
4
2 5
1 4
3 3
5 8
5.输出样例
1.41
问题分析
已知集合S中有n个点,使用分治法的思想就是将S进行拆分,分为2部分求最近点对。算法每次选择一条垂线L,将S拆分左右两部分为SL和SR,( L一般取点集S中所有点的中间点的x坐标来划分,这样可以保证SL和SR中的点数目各为n/2 否则以其他方式划分S,有可能导致SL和SR中点数目一个为1,一个为n-1,不利于算法效率,要尽量保持树的平衡性 )
依次找出这两部分中的最小点对距离:δL和δR,记SL和SR中最小点对距离δ = min{δL,δR}
代码示例
#include<iostream>
#include<cmath>
#include <iomanip>
#define TRUE 1
#define FALSE 0
using namespace std;
typedef struct Node//坐标点
{
double x;
double y;
}Node;
typedef struct List
{
Node* data; //点
int count; //点的个数
}List;
typedef struct CloseNode
{
Node a;
Node b; //计算距离的两个点
double space; //距离平方
}CloseNode;
int n; //点的数目
//输入各点到List中
void create(List &L)
{
cin >> n;
L.count = n;
L.data = new Node[L.count]; //动态空间分配
for (int i = 0; i<L.count; ++i)
cin >> L.data