zoukankan      html  css  js  c++  java
  • 算法分析与设计(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

    越自律,越自由
  • 相关阅读:
    [转载]windows进程中的内存结构
    RTTI和4个强制转换运算符
    由于应用程序配置不正确,程序未能启动
    光照
    服务器数据同步
    SAP
    PHP输入流php://input
    五款常用mysql slow log分析工具的比较
    开发搜索引擎–PHP中文分词
    大型网站调试工具之一(php性能优化分析工具XDebug)
  • 原文地址:https://www.cnblogs.com/ha-chuochuo/p/14704368.html
Copyright © 2011-2022 走看看