c语言 分治法求解最近点对问题

最近对问题(二维平面上的点),编程实现用分治法求解。

最近点对算法:

double cpair2(S)

{

      n=|S|;

      if (n < 2) return 0;

1)、m=S中各点x坐标的中位数;

     //构造S1S2

     S1={pS|x(p)<=m},

     S2={pS|x(p)>m}

2)、d1=cpair2(S1);

      d2=cpair2(S2);

3)dm=min(d1,d2);

4)、设P1S1中距垂直分割线l的距离在dm之内的所有点组成的集合;

   P2S2中距分割线l的距离在dm之内所有点组成的集合;

   将P1P2中点依其y坐标值排序;

   并设XY是相应的已排好序的点列;

5)、通过扫描X以及对于X中每个点检查Y中与其距离在dm之内的所有点(最多6)可以完成合并;

   当X中的扫描指针逐次向上移动时,Y中的扫描指针可在宽为2dm的区间内移动;

   设dl是按这种扫描方式找到的点对间的最小距离;

6)d=min(dm,dl);

      return d;

}

具体代码:

#include

#include

#include

#define min(x,y) (x

#define MAX 100

struct zuobiao{

int x,y;

}z[MAX];

double distance(zuobiao z1,zuobiao z2)

{

double t;

t=(z1.x-z2.x)*(z1.x-z2.x)+(z1.y-z2.y)*(z1.y-z2.y);

return sqrt(t);

}

double fenzhi(zuobiao s[],int left,int right) {

    if (right-left == 1) {

        return distance(s[right], s[left]);

    }

    if (right - left == 2) {

        double d1 = distance(s[right], s[left]);

        double d2 = distance(s[right], s[left+1]);

        double d3 = distance(s[left+1], s[left]);

        d2 = min(d1, d2);

        d3 = min(d2, d3);

        return d3;

    }

    int m = (right+left) / 2;

int i,j;

    double d1 = fenzhi(s,left, m);

    double d2 = fenzhi(s, m+1,right);

    double d = min(d1, d2);

    int l = left, r = right;

    while (s[l].x < s[m].x - d && l <= right);

        l++;

    while (s[r].x > s[m].x + d && r>=left)

        r--;

    double d3;

    for (i = l; i <=r; i++) {

        for (j = i+1;j<=r; j++) {

            if (s[j].y - s[i].y >= d) {

                break;

            }

            else {

                d3 = distance(s[i], s[j]);

                if (d3 < d)

                    d = d3;

            }

        }

    }

    return d;

}

void main()

{

int i,j;

int n=rand()%10+5;

printf("随机生成的点数为: %d\n",n);

for(i=0;i

z[i].x=rand()%100+1;

z[i].y=rand()%100+1;

for(j=0;j

if(z[j].x==z[i].x&&z[j].y==z[i].y){

i--;

break;

}

}

}

for(i=0;i

printf("(%d,%d)     ",z[i].x,z[i].y);

}

printf("\n最近点对最小距离为 %lf\n",fenzhi(z,0,n-1));

}

结果截图:

 

 

 

c语言 分治法求解最近点对问题_第1张图片

 

 

 

 

你可能感兴趣的:(c语言 分治法求解最近点对问题)