实验三 最近点对
1.算法设计思路:
设共有 n 个点,找其中距离最近的两点及其距离。
(1)蛮力法:
蛮力法的思路是把所有点之间距离比较找出中间最小的。先假设最短距离是第一个元
素和第二个元素的距离,然后求第一个元素与其后的(n-1)个元素各自的距离,若比之前
记录的最短距离小则记录当前值···求第 i 个元素与其后的(n-i)个元素各自的距离,记录
之前所得到的所有距离中的最小值,直到计算到第(n-1)个元素与第 n 个元素的距离,此
时记录的距离即为这 n 个元素中的最短距离。
(2)分治法:
分治法是把一个大的问题划分成相似的小问题,采用递归的思想。找中线把 n 个元素
分成左右两部分元素分别求得两边的最短距离,然后取两者中的最小者记为 l,在中线两边
分别取 l 的距离,记录该距离范围内点的个数,中线左边有 L 个元素,右边有 R 个元素,
求左边元素到右边元素的距离看其是否小于之前记录的最短距离,小则记录下来,此时的
右边元素只取 y 值和左边元素 y 值距离小于 l 的(减少循环次数)。循环结束即可找到最小
的距离。
2.程序代码:
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cmath>
using std::cout;
using std::endl;
#define N 5
int x[N],y[N],record[N]; //产生原始点数据,x 坐标放在 x[]中,y 坐标放在 y[]中。
double Min;
//////////////////////////产生随机数组/////////////////////////////
void randnum()
{
int i;
srand(time(0));
for (i=0;i<N;i++)
{
x[i]=rand()%N;
cout<<x[i]<<' ';
}
cout<<endl;
for (i=0;i<N;i++)
{
y[i]=rand()%N;
cout<<y[i]<<' ';