算法设计与分析:分治法求最近点对问题

目录

一、实验目的

二、实验内容

三、算法思想

四、实验步骤

1、蛮力法

2、分治法

2.1 先用快速排序SortX(A,1,n)将所有点按x坐标升序排序

2.2 点数n<=3时直接计算,时间复杂度为O(1)

2.3 点数n>3时

五、实验结果和分析


实验目的

1. 掌握分治法思想;

2. 学会最近点对问题求解方法。

、实验内容

1. 对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短距离的两点。

2. 要求随机生成N个点的平面坐标,应用蛮力法编程计算出所有点对的最短距离。

3. 要求随机生成N个点的平面坐标,应用分治法编程计算出所有点对的最短距离。

4. 分别对N=100000~1000000,统计算法运行时间,比较理论效率与实测效率的差异,同时对蛮力法和分治法的算法效率进行分析和比较。

5. 如果能将算法执行过程利用图形界面输出,可获加分。

算法思想

1. 预处理:根据输入点集S中的x轴和y轴坐标进行排序,得到X和Y,很显然此时X和Y中的点就是S中的点。

2. 点数较少时的情形

3. 点数|S|>3时,将平面点集S分割成为大小大致相等的两个子集SL和SR,选取一个垂直线L作为分割直线,如何以最快的方法尽可能均匀平分?注意这个操作如果达到效率O(n^2),将导致整个算法效率达O(n^2)。

4. 两个递归调用,分别求出SL和SR中的最短距离为dl和dr。

5. 取d=min(dl, dr),在直线L两边分别扩展d,得到边界区域Y,Y'是区域Y中的点按照y坐标值排序后得到的点集(为什么要排序?),Y'又可分为左右两个集合Y'L和Y'R

6. 对于Y'L中的每一点,检查Y'R中的点与它的距离,更新所获得的最近距离,注意这个步骤的算法效率,请务必做到线性效率,并在实验报告中详细解释为什么能做到线性效率?

、实验步骤

先定义全局变量和点结构:

#define max 1000000000;//假定最大距离
int n,m,**v;
//n为规模,m为创建点集合过程时的点数,v用于判断是否已有该点(rand不产生大于40000的数)
double time1,time2;//蛮力法、分治法花费的时间
double dt1,dt2=max;//蛮力法、分治法求得的最近距离
//---------------------------
struct D{//点结构int x=0,y=0;
};
D a1,b1,a2,b2;//a1、b1为蛮力法求得的点的下标,a2、b2为分治法求得的点的下标
D *k,*p;//蛮力法、分治法用的点集合

1、蛮力法

        对前面n-1个点的每一个点,均与在其后面的每个点进行距离计算,并与最小距离min比较,若比min小,则更新min的值,时间复杂度为O(n2)。

    伪代码:

Manli(A)min=Infinity//最小距离for i=0 to A.length-1for j=i+1 to A.lengthd=dis(A[i],A[j])//A[i]、A[j]两点的距离if d<minmin=da=ib=ja1=ab1=breturn min

2、分治法

2.1 先用快速排序SortX(A,1,n)将所有点按x坐标升序排序

        方便分治均匀,时间复杂度为O(nlgn)。 

SortX(l,r)i=l,j=r,keyx=A[l].x,keyy=A[l].y //Array A is a global variablewhile i<jwhile i<j and A[j].x>=keyxj--if i<jA[i]=A[j]i++elsebreakwhile i<j and A[i].x<=keyxi++if i<jA[j]=A[i]j--A[i].x=keyx,A[i].y=keyyif(l<i-1) SortX(l,i-1)if(i+1<r) SortX(i+1,r)
2.2 点数n<=3时直接计算,时间复杂度为O(1)

2.3 点数n>3

        将平面点集S分割成为大小大致相等的两个子集SL和SR,选取一个垂直线L(以x坐标居中的为分治点,上面已排序好了)作为分割直线。

        两个子集递归调用(当只有一个元素时返回无穷大,两个时按y升序排序这两个元素),分别求出SL和SR中的最短距离dl和dr。

        取最小值d=min(dl, dr),在直线L两边分别扩展d,得到边界区域Y。       

        然后用Marge(l,mid,r)函数按纵坐标升序归并左右两部分点集合,时间复杂度O(n)

        由于前面点已按y升序排序,所以在区域Y中,两点距离小于当前min的可能情况为在一个长2*d,、宽d的长方形内。

        由于已知两边的最小距离为d,则对在这个长方形内任意一点P,距P为d的点Q的个数不超过6个,例如下面的点P最多在左右两个正方形的6条边上各有一个点距P为d(但是此情况下,在同一个正方形内的其他两个点的距离已经小于当前最小距离小于d了,所以可能的点数不超过6);

        再或者是说,在这个长方形内,最多就六个点相距d,即六个顶点。

        所以,只需要对t点集中的每个点与其后面的5个点比较距离是否小于当前最小距离d并更新d就行。时间复杂度O(n)。

        综上所述,T(n)=2*T(n/2)+f(n)。f(n)为Marge和遍历t点集,时间复杂度均为O(n),共递归lgn次,则时间复杂度为O(nlgn)。前面按x坐标排序的时间复杂度为O(nlgn),所以总的时间复杂度为O(nlgn)。

        伪代码如下:

Fenzhi(l,r)if l==r //一个点return max //直接返回无穷大if l+1==r //两个点,按y升序排序D x1=A[l],x2=A[r]A[l]=x1.y<x2.y?x1:x2A[r]=x1.y>=x2.y?x1:x2if dis(A[l],A[r]) < dt2)dt2=dis(A[l],A[r])a2=A[l]b2=A[r]return dis(A[l],A[r])if l+1<r //点数大于2mid=(r+l)/2 mid为分治中点,将点集合划分为左右均匀的两部分d=min(Fenzhi(l,mid),Fenzhi(mid+1,r))//d取左右两部分最小距离的较小值if d < dt2)dt2=dis(A[l],A[r])a2=A[l]b2=A[r]Merge(l,mid,r) //按纵坐标升序归并左右两部分的点D *t=new Point[r-l+1]//记录跨中线且距离分治中点d水平距离小于当前最小值d的异侧点tn=0 //t点集的元素个数for i=1 to rif A[i].x>(A[i].x-d) and A[i].x<(A[i].x+d)//异侧且距分治中心mid小于d则入tt[tn++]=A[i]for i=0 to tn-1for j=i+1 to tn-1 and j<i+6 //往后判断5个点//t[]中y升序,若y坐标差已超过当前d,break,判断下一个点if t[j].y-t[i].y>dbreakif dis(t[i],t[j])<d //如果当前点距离小于等于当前d,则对最小距离d进行更新d=dis(t[i],t[j])if d < dt2a2=t[i]b2=t[j]return d //返回当前分治的最小距离

        运行结果如下(取其中两例):两种方法求得的最近距离一致(虽然不一定是同一对点),且分治法更快。可见算法查找正确。

五、实验结果和分析

        分别对N=100000~1000000,统计算法运行时间,比较理论效率与实测效率的差异,同时对蛮力法和分治法的算法效率进行分析和比较。

        这里修改了代码,对每个规模N均运行5趟取平均时间。

算法

规模N:

5000

10000

20000

30000

50000

70000

100000

蛮力法

实测效率/s

0.334

1.2372

4.7186

10.0754

30.1722

59.1302

120.953

理论效率/s

0.3076

1.2304

4.9216

11.0736

30.76

60.2896

123.04

                                                                             表1

算法

规模N:

50000

100000

200000

300000

500000

700000

1000000

分治法

实测效率/s

0.058

0.156

0.266

0.3618

0.726

1.012

1.44

理论效率/s

0.0601

0.1278

0.271

0.42

0.7283

1.0458

1.5336

        对于蛮力法,

                                                                 T实测=k·n2实测      

                                                                 T理论=k·n2理论

        所以可得                                       

                                                        T理论=T实测·(n理论/n实测)2

        根据上式,以N=10000为基准,求出蛮力法的理论效率。

        对于分治法

                                                                T实测=k·n实测lgn实测      

                                                                T理论=k·n理论lgn理论

        所以可得           

                                                T理论=T实测·(n理论·lgn理论)/(n实测·lgn实测)

        根据上式,以N=100000为基准,求出分治法的理论效率。

        作出蛮力法的实测效率和理论效率曲线图如下:

        可以看出,实测效率和理论效率曲线贴合度很高,也都符合n2二次曲线。n=100000时的时间消耗,基本约为n=10000时的100倍。

        作出分治法的实测效率和理论效率的曲线图如下:

        可以看出,分治法的实测曲线和理论曲线贴合度还行,但没有蛮力法的两条贴合度高,可能是由于实验次数不够大(只进行5次取平均)。符合nlgn型曲线走势。

        对比两种方法,分治法效率明显由于蛮力法,尤其是当规模N持续增大时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArkUI部分案例笔记——padding,space

基础的构建 组件分类&#xff1a; 容器组件&#xff1a;像Column&#xff0c;Row这种组件就是容器组件一般就来控制行和列的就是容器组件 基础组件&#xff1a;Text(文本组件)&#xff0c;像这种用来有一定功能的就是基础组件 注意&#xff1a;一个build只能有一个根容器组件…

苹果智能和人工智能最大化

苹果智能和人工智能最大化 除了苹果公司&#xff0c;还没有人真正使用过苹果的智能功能。它要到秋天才会分阶段发布&#xff0c;即使到那时&#xff0c;它也无法在80%或90%的iPhone安装基础上运行&#xff0c;因为它需要只有iPhone 15 Pro才能使用的设备上处理功能。没有什么能…

海南聚广众达电子商务咨询有限公司抖音电商新标杆

在数字经济的浪潮中&#xff0c;抖音电商正成为一股不可忽视的力量。海南聚广众达电子商务咨询有限公司&#xff0c;作为专注于抖音电商服务的领军企业&#xff0c;凭借其专业的团队和创新的思维&#xff0c;不断助力商家在抖音平台上实现商业价值的最大化。 海南聚广众达电子…

Github上传大于100M的文件(ubuntu教程)

安装Git-lfs Git Large File Storage (LFS) 使用 Git 内部的文本指针替换音频样本、视频、数据集和图形等大文件&#xff0c;同时将文件内容存储在 GitHub.com 或 GitHub Enterprise 等远程服务器上。官网下载&#xff1a;https://git-lfs.github.com/ ./install.sh上传 比如…

基于SpringBoot+Vue大学生网络教学平台设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

LLC开关电源开发:第四节,LLC软件设计报告

LLC源代码链接 数控全桥LLC开发板软件设计报告  1. LLC硬件及软件框架2. LLC软件设计2.1 工程文件说明2.2 LLC中断设计2.2.1 20us中断2.2.2 5ms中断 2.3 LLC状态机设计2.3.1 初始化状态2.3.2 空闲状态2.3.3 软启动状态2.3.4 正常运行状态2.3.5 故障状态 2.4 环路设计2.4.1 环路…

机器学习课程复习——逻辑回归

1. 激活函数 Q:激活函数有哪些? SigmoidS型函数Tanh 双曲正切函数

Nature Climate Change | 气候变暖会造成未来全球干旱区面积扩张?

在气候变暖的情况下&#xff0c;旱地通常被预测将在全球范围内扩大&#xff0c;旱地包括以水资源有限、植被稀疏为特征的土地区域。然而&#xff0c;这种预测依赖于旱地的大气代用物&#xff0c;即干旱指数。最近的研究表明&#xff0c;干旱指数对陆地水循环的各种组成部分的预…

设计模式1-简介

设计模式简介 专栏的目的什么是设计模式设计模式要学什么软件开发原则主流设计模式 学习建议经典面试题 资源 专栏的目的 1.理解松耦合的设计思想 2.掌握面向对象设计原则 3.掌握重构技法改善设计 4.掌握GOF核心设计模式 什么是设计模式 每一个模式描述了一个在我们周围不…

公共 IP 地址和私有 IP 地址的区别总结

什么是IP地址&#xff1f; IP 地址&#xff0c;即互联网协议地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;是网络设备在网络中进行通信的标识。IP 地址可以看作是设备在网络中的“地址”&#xff0c;有助于数据包在网络中找到正确的接收端。IP 地址主要…

基于大型语言模型的全双工语音对话方案

摘要解读 我们提出了一种能够以全双工方式运行的生成性对话系统&#xff0c;实现了无缝互动。该系统基于一个精心调整的大型语言模型&#xff08;LLM&#xff09;&#xff0c;使其能够感知模块、运动功能模块以及一个具有两种状态&#xff08;称为神经有限状态机&#xff0c;n…

Vue: Module “vue“ has no exported member xxx

这个问题让我困扰了好一会儿&#xff0c;我询问了 chatgpt 和各种网站社区&#xff0c;尝试了切换依赖的版本&#xff0c;清除缓存等等&#xff0c;依然没有解决 不过算是有心栽花花不开&#xff0c;无心插柳柳成荫&#xff0c;碰巧解决了&#xff0c;也不知道是不是这个原因&a…

Win11下安装VS2022失败的解决办法

前几天我把我的HP Z840的操作系统换成了Win11&#xff0c;在重装VS2022时遇到了麻烦&#xff0c;提示无法安装 Microsoft.VisualStudio.Devenv.Msi。 查看安装日志提示&#xff1a;Could not write value devenv.exe to key \SOFTWARE\Microsoft\Internet Explorer\Main\Featur…

轻松获取指定日期所在周的周一和周日

哈喽&#xff0c;大家好呀&#xff0c;好久不见&#xff01;今天是一篇浅记。根据传入日期自动获取所在周一和周日… 正常基操方法&#xff0c;根据传入日期自动获取所在周一和周日。注意传入日期是周日的情况哈&#xff0c;需要往前推7天才是周一。 楼主方法中已处理&#xf…

57.SAP MII产品介绍(07)功能详解(06)Workbench-SQLQuery

1.SQLQuery概念 您可以使用SAP Manufacturing Integration and Intelligence&#xff08;SAP MII&#xff09;Workbench中的SQLQuery来创建访问面向SQL的连接器&#xff08;如IDBC连接器&#xff09;的模板。此查询的扩展名为tqsq。 简而言之&#xff0c;SQLQuery就是一段…

计算机系统基础实训七-MallocLab实验

实验目的与要求 1、让学生理解动态内存分配的工作原理&#xff1b; 2、让学生应用指针、系统级编程的相关知识&#xff1b; 3、让学生应用各种动态内存分配器的实现方法&#xff1b; 实验原理与内容 &#xff08;1&#xff09;动态内存分配器基本原理 动态内存分配器维护…

细说MCU的ADC模块单通道单次采样的实现方法

目录 一、工程依赖的硬件 二、设计目的 三、建立工程 1、配置GPIO 2、配置中断 3、配置串口 4、配置ADC 5、选择时钟源和Debug 6、配置系统时钟和ADC时钟 四、设置采样频率 五、代码修改 1、重定义外部中断回调函数 2、启动ADC 3、配置printf函数 六、运行并…

mysql5.7windows安装修改密码

mysql5.7windows安装修改密码 1.首先下载Windows 64位安装包2.安装服务3.my.ini4.初始化4.做成Windows服务5.重置密码 1.首先下载Windows 64位安装包 2.安装服务 双击运行安装服务&#xff0c;一直next&#xff1b; 在Choose Setup Type界面中 选择Custom选项&#xff0c;意思…

头歌资源库(14)残缺棋盘

一、 问题描述 二、算法思想 首先&#xff0c;将2^k 2^k的棋盘划分为四个相等大小的子棋盘&#xff0c;定义为左上、左下、右上和右下四个子棋盘。 然后&#xff0c;根据残缺格的坐标&#xff0c;确定其中一个子棋盘是不完整的&#xff0c;即残缺子棋盘。假设残缺子棋盘是左…

新火种AI|Claude 3.5一夜封王超越GPT-4o!留给OpenAI的时间真的不多了...

AI大模型更新换代的速度&#xff0c;的确快到令人难以想象。 相信很多人现在对“最先进AI大模型”的印象还停留在GPT-4&#xff0c;但事实上&#xff0c;大模型领域的头把交椅早已悄然易主了好几回。就在GPT-4惊艳全球不久之后&#xff0c;其“死对头” Anthropic发布了Claude…