用分治算法解平面最接近点对问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一. 用分治算法解平面最接近点对问题
1.题目
关于最接近点对问题:
给定平面上n个点,找出其中一对点,使得在n个点所构成的所有点对中,该点对的距离最小。
2.程序详细介绍(各模块的功能等)
本程序主要包括两个类:类Point和类Ppoint.其中类Point为处理一些的基本数据传递等.类Ppoint为该程序的主要实现模块,该类中有输入点对的函数shuru,对所输入的点对按X轴排序的函数sort,求各点对的距离的函数xiao等.
假设S中的点为平面上的点,它们都有2个坐标值x和y。为了将平面上点集S线性分割为大小大致相等的2个子集S1和S2,我们选取一垂直线l(方程:x=m)来作为分割直线。其中m为S中各点x坐标的中位数。由此将S分割为S1={p∈S|px≤m}和S2={p∈S|px>m}。从而使S1和S2分别位于直线l的左侧和右侧,且S=S1∪S2 。由于m是S中各点x坐标值的中位数,因此S1和S2中的点数大致相等。递归地在S1和S2上解最接近点对问题,我们分别得到S1和S2中的最小距离δ1和δ2.此即为该程序的大致算法.
3. 程序结构(流程图)
该程序的流程图如下所示
4. 调试与测试:调试方法,测试结果(包括输入数据和输出结果)的分析与讨论
运行该程序时,屏幕上会出现一个界面,首先该界面会提示输入要处理的点对个数,输入点对个数后从键盘输入数字0即可显示出处理后的各个结果,会出现如下结果:
5.程序代码(源程序)
#include
#include
#include
using namespace std;
int i,j,k,d,m,n;
double p2,q,s,r,t;
class Point //创建一个点类//
{
public:
double x;
double y;
double getx()
{
return x;
}
double gety()
{
return y;
}
friend class Ppoint;
};
class Ppoint
{
int sum;
double juli[10][10];
double min[11]; //min[10]用来存放每组中最短的距离//
double mini[11]; //mini[10]用来存放每组中距离最短的点对中的第一个点//
double minj[11]; //minj[10]用来存放每组中距离最短的点对中的第二个点//
Point p[100];
Point p1;
public:
void shuru()
{
cout<<"请输入要处理的点的个数"< cin>>sum; for(i=0;i { cout<<"请输入点对"< cin>>p[i].x; cin>>p[i].y; cout< } } void sort() { cout<<"以下是按x轴上由小到大排序后的点对"< for(i=0;i { for(j=i+1;j { if(p[i].x>p[j].x) { p1=p[i]; p[i]=p[j]; p[j]=p1; } } } for(i=0;i { cout< } } void xiao() { cout<<"以下是对每个模块中的点求距离"< for(k=0;k { cout<<"按任意键继续"< cin>>i; cout<<"以下是第"< for(i=1;i<10;i++) { for(j=0;j { r=abs(p[k*10+i].x-p[k*10+j].x); t=abs(p[k*10+i].y-p[k*10+j].y); juli[i][j]=sqrt(r*r+t*t); cout< } cout< } min[k]=juli[k][0],mini[k]=10*k+1,minj[k]=10*k; for(i=1;i<10;i++) { cout<<"\n"<<"第"< for(j=0;j { if(juli[i][j] { min[k]=juli[i][j]; mini[k]=10*k+i; minj[k]=10*k+j; } } } cout<<"\n"<<"这是第"< cout<<"\n"<<"距离最小值为"< cout<<"\n"<<"距离最小值的第一个点为"< } if(sum%10!=0) { k=sum/10; cout<<"输入0显示结果"< cin>>i; for(i=1;i { for(j=0;j { m=abs(p[k*10+i].x-p[k*10+j].x); n=abs(p[k*10+i].y-p[k*10+j].y); juli[i][j]=sqrt(m*m+n*n); cout< cout<<"\t"; } cout< } min[k]=juli[1][0],mini[k]=10*k+1,minj[k]=10*k; for(i=1;i { cout<<"\n"<<"第"< for(j=0;j {