算法分析与设计(work5)

1、问题

给出\(n\)个平面上的点,求出距离最近的两个点的坐标以及最近距离。

2、解析

蛮力法:
对每对点之间相互比较,求出最小值即可。

分治法:
对所有点按照\(x\)轴或\(y\)轴进行排序,然后把这个集合里的点分成两半,依次分开,最后在一步一步合并起来即可。

3、设计

蛮力法:

    for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			double nowdis=dis(s[i],s[j]);
			if(nowdis<min_dis){
				min_dis=nowdis;
				p1=s[i];
				p2=s[j];
			}
		}
	}

分治法

void solve(int l,int r)
{
	if(r-l==1){
		double nowdis=dis(s[l],s[r]);
		if(min_dis>nowdis){
			p1=s[l];
			p2=s[r];
			min_dis=nowdis;
		}
	}else if(r-l==2){
		double nowdis=dis(s[l],s[l+1]);
		if(nowdis<min_dis){
			p1=s[l];
			p2=s[l+1];
			min_dis=nowdis;
		}
		nowdis=dis(s[l],s[r]);
		if(nowdis<min_dis){
			p1=s[l];
			p2=s[r];
			min_dis=nowdis;
		}
		nowdis=dis(s[l+1],s[r]);
		if(nowdis<min_dis){
			p1=s[l+1];
			p2=s[r];
			min_dis=nowdis;
		}
	}else{
		int mid=(l+r)/2;
		solve(l,mid);
		solve(mid+1,r);
		temp.clear();
		for(int i=l;i<=r;i++){
			if(s[i].x-s[mid].x<min_dis){
				temp.push_back(s[i]);
			}
		}
		for(int i=0;i<temp.size();i++){
			for(int j=i+1;j<temp.size();j++){
				double nowdis=dis(temp[i],temp[j]);
				if(nowdis<min_dis){
					min_dis=nowdis;
					p1=temp[i];
					p2=temp[j];
				}
			}
		}
	}
}

4、分析

蛮力法:
需要每对点之间进行比较,可以推出时间复杂度\(O(n^2)\)

分治法
对点排序时间复杂度\(O(nlogn)\),对点进行分治时间复杂度\(O(logn)\),需要遍历到每个点,时间复杂度\(O(n)\),总时间复杂度\(O(nlogn)\)

5、源码

github源码:https://github.com/HaHe-a/Algorithm-analysis-and-design-code

posted @ 2021-04-26 14:02  hachuochuo  阅读(64)  评论(0编辑  收藏  举报