实验七 最近点对问题的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验七最近点对问题的设计与实现

一、实验目的

1.掌握分治算法的基本原理

2.利用分治策略编程解决最近点对问题

二、实验要求

1.设计算法

2.写出相应程序

3.保存和打印出程序的运行结果,并结合程序进行分析。

三、实验内容

算法思想:用分治法解决最近对问题,很自然的想法就是将集合S分成两个子集S1和S2,每个子集中有n/2个点。然后在每个子集中递归地求其最接近的点对,在求出每个子集的最接近点对后,在合并步中,如果集合S 中最接近的两个点都在子集S1或S2中,则问题很容易解决,如果这两个点分别在S1和S2中,则根据具体情况具体分析。

1、考虑一维情形下的最近点对问题:

设x1, x2, …, xn是x轴上有n个点构成的集合S,最近对问题就是找出集合S中距离最近的点对。

算法思想:用x轴上的某个点m将S划分为两个集合S1和S2,并且S1和S2含有点的个数近似相同。递归地在S1和S2上求出最接近点对 (p1, p2) 和(q1, q2),如果集合S 中的最接近点对都在子集S1或S2中,则d=min{(p1, p2), (q1, q2)}即为所求,如果集合S中的最接近点对分别在S1和S2中,则一定是(p3, q3),其中,p3是子集S1中的最大值,q3是子集S2中的最小值。

例如:(1)输入 -8,-5,-4,1,3,7,输出为1.

(2)输入 -8,-5,-2,1,3,7,输出为2.

(3)输入 -8,-4,-1,1,4,7,输出为2.

附加题:(有时间可继续完成下面内容)

2、考虑一维情形下的最近点对问题:

设p1=(x1, y1), p2=(x2, y2), …, p n=(x n, y n)是平面上n个点构成的集合S,最近对问题就是找出集合S中距离最近的点对。

算法:

四、程序代码

#include

int a(int * p,int low,int high)

{

int min=0,min1,min2,min3;

int m=(high+low)/2;

if(high-low>1)

{

min1=a(p,low,m);

min2=a(p,m+1,high);

min=min1

else

if(low==high)

return p[high]-p[low-1];

else

return p[high]-p[low];

return min;

}

int main()

{

int p[20],x;

printf("请输入数组个数:");

scanf("%d",&x);

printf("请输入数组元素:\n");

for(int i=0;i

scanf("%d",&p[i]);

printf("最短距离为:%d",a(p,0,x-1));

return 0;

}

五、结果及分析

第一组第二组第三组

相关文档
最新文档