实验七 最近点对问题的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; } 五、结果及分析 第一组第二组第三组