《算法分析》作业5

1. 问题

在二维平面中给出N个点的坐标,求其中最近点对的距离

2. 解析

方法一:暴力法,对每个点都和(n-1)个点判断,不断求最小距离。

方法二:分治法,我们将平面上N个点的集合分成两个子集s1s2,每个子集约N/2个点,然后在每个子集中递归地求最接近的点对。

 

3.核心伪代码

 

蛮力法:
double baoli(){
    double dmin=inf;
    rep(i,0,n-1){
        rep(j,i+1,n-1){
            dmin=min(dmin,dis(i,j));
        }
    }
    return  dmin;
}

 

分治法:
double dfs(int l,int r){
    double dmin=inf;
    if(l==r) return dmin;
    if(l+1==r) return dis(l,r);
    int mid=(l+r)>>1;
    double d1=dfs(l,mid);
    double d2=dfs(mid+1,r);
    dmin=min(d1,d2);
    int cnt=0;
    rep(i,l,r){
        if(fabs(p[mid].x-p[i].x)<=dmin)  mp[cnt++]=i;
    }
    sort(mp,mp+cnt,cmpy);
    rep(i,0,cnt-1){
        rep(j,i+1,cnt-1){
            if(p[mp[j]].y-p[mp[i]].y>=dmin) break;
            double d3=dis(mp[i],mp[j]);
            dmin=min(dmin,d3);
        }
    }
    return dmin;
}

 

 

4.复杂度分析:

  蛮力法:复杂度(n*(n-1)/2)所以时间复杂度就是O(n^2)

  分治法:时间复杂度O(nlogn*logn)

 

 

5.github源码地址:

https://github.com/xiaojunjun601/sfHomework1/commit/923eb3fd7442b4b43bdcf7a594c49c3623bdcef7

 

posted @ 2021-04-12 16:39  JamZF  阅读(63)  评论(0编辑  收藏  举报