• 算法分析与设计(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

    越自律,越自由
  • 相关阅读:
    JavaScript内部原理:浏览器的内幕
    DOM结构深度优先遍历(二):TreeWalker
    DOM结构深度优先遍历(一):NodeIterator
    Linux bc 命令
    两个小function实现XML和string相互转化
    Git 多用户配置
    Vue 新增的$attrs与$listeners的详解
    CSS mask遮罩
    flask之后端传值给前端
    python cv2在验证码识别中的使用
  • 原文地址:https://www.cnblogs.com/ha-chuochuo/p/14704368.html
Copyright © 2020-2023  润新知