分治法求最近点对问题

目录

蛮力法

分治法

探究分治规模小于一定程度时采用暴力解法


蛮力法

  • 算法思想

蛮力法,顾名思义,即穷举所有点与点之间的距离,两层循环暴力找出最近点对。算法执行可视化如图1所示,word文档GIF静态显示,附件已含动图。

图1

  • 伪代码

matlab代码 

result=[];
for power=1:10scale=power*100000;count=0;for times=1:20x=randi(scale,1,scale);y=randi(scale,1,scale);tic;[i,j]=brute(x,y,scale);count=count+toc;           endcount=count/20;result=[result,count];
end
function [mini,minj]=brute(x,y,scale)mini=1;minj=1;minDistance=Inf;for i=1:scale-1for j=1:scaleif i==jbreakenddistance=(x(i)-x(j))^2+(y(i)-y(j))^2;if distance<minDistancemini=i;minj=j;minDistance=distance;endendend
end
  • 实验结果

环境为MATLAB,数据规模为1w到5w,运行结果如图2所示。

图2

具体数据如表1所示。

表1

分析:

由实验结果可知,蛮力法的实验值与理论值基本一致,算法的时间复杂度确实为O(n2),确实很慢。

分治法

  • 算法思想

先对点进行预处理按横坐标排序,然后每次将点均分成左右两个子集,最短距离的两个点要么都在左子集,要么都在右子集,要么一个点在左子集中,一个点在右子集中,对于前面两种情况,问题变成递归寻找子集的最短距离,算法执行可视化如图3所示,word文档GIF静态显示,附件已含动图。

 

图3

而对于跨越中间线的情况,由左右两个子集可以算出一个目前最短距离minDistance,然后将距离中间点的距离小于minDistance的点找出来,如图4所示。

图4

如果存在最短距离,那么一定是一边一个点,所以我们需要将两边点的距离算一下,实际上,我们需要对于一边的点,我们需要计算距离的点最多不超过4个,因为同一边的点与点之间的距离肯定大于等于minDistance,所以对于另一边的点来说,范围小于minDistance内的点不会超过4个,如图5所示。

图5

  • 伪代码

matlab代 

result=[];
for power=1:10scale=power*100000;count=0;for times=1:20x=randi(scale,1,scale);y=randi(scale,1,scale);tic;[x,y]=Quick(1,scale,x,y);[mini,minj,minDistance]=divide(x,y,scale);count=count+toc;           endcount=count/20;result=[result,count];
end
function [mini,minj,minDistance]=brute(x,y,scale)mini=1;minj=2;minDistance=Inf;for i=1:scale-1for j=i+1:scaledistance=(x(i)-x(j))^2+(y(i)-y(j))^2;if distance<minDistancemini=i;minj=j;minDistance=distance;endendend
end
function [mini,minj,minDistance]=divide(x,y,scale)if length(x)<3[mini,minj,minDistance]=brute(x,y,scale);return;endhalf=floor(scale/2);[i,j,minLeft]=divide(x(1:half),y(1:half),half);[ii,jj,minRight]=divide(x(half+1:scale),y(half+1:scale),scale-half);if minLeft<minRightminDistance=minLeft;mini=i;minj=j;elseminDistance=minRight;mini=ii;minj=jj;endleft=[];right=[];for i=half-1:-1:1if abs(x(i)-x(half))>=sqrt(minDistance)breakendleft=[left,i];endfor i=half+1:scaleif abs(x(i)-x(half))>=sqrt(minDistance)breakendright=[right,i];endfor i=1:length(left)for j=1:length(right)if j>3breakenddistance=(x(left(i))-x(right(j)))^2+(y(left(i))-y(right(j)))^2;if distance<minDistancemini=left(i);minj=right(j);minDistance=distance;endendendfor i=1:length(right)for j=1:length(left)if j>3breakenddistance=(x(left(j))-x(right(i)))^2+(y(left(j))-y(right(i)))^2;if distance<minDistancemini=left(j);minj=right(i);minDistance=distance;endendend
end
function[x,y]=Quick(low,high,x,y)i=low;j=high;pivot=x(low);temp=y(low);while low<highwhile low<high&&pivot<=x(high)high=high-1;endif low<highx(low)=x(high);y(low)=y(high);low=low+1;endwhile low<high&&pivot>x(low)low=low+1;endif low<highx(high)=x(low);y(high)=y(low);high=high-1;endendx(low)=pivot;y(low)=temp;if i<low-1[x,y]=Quick(i,low-1,x,y);endif high+1<j[x,y]=Quick(high+1,j,x,y);end
end
  • 算法复杂度

对于数据规模为n的情况,二分的次数为log2n次,而计算跨中间线距离的时候计算次数小于3n,即此处的时间复杂度是线性的,即T(n)=T(n/2)+O(n),可算得T(n)=nlogn。

  • 实验结果

先在小规模数据上跑,环境为MATLAB,数据规模为1w到5w,运行结果如图6所示。

图6

具体数据如表2所示。

表2

数据规模为10w到100w,运行结果如图7所示。

图7

具体数据如表3所示。

表3

分析:

由实验结果可知,分治法明显远远快于蛮力法,小规模数据时实验值略小于理论值,大规模时实验值与理论值基本一致。

探究分治规模小于一定程度时采用暴力解法

由于分治时不断递归调用函数,程序开销较大,考虑当分治到数据规模小于一定程度时采用暴力解法的运行效果,数据规模为1w,参数设置100到1000测试,结果如图8所示。

图8

由实验结果可知,分治规模达到200时使用暴力效果最佳,将参数设置为200,在数据规模为1w到5w上与原始分治法对比,如图9所示。

图9

在数据规模为10w到100w上与原始分治法对比,如图10所示。

图10

分析:

由实验结果可知,在分治规模小于一定数量时采用暴力求解效率更快,特别是在数据规模大的时候,这种暴力分治相结合的方法相比原始分治法具有很大的优势。

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

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

相关文章

阿里版ChatGPT——通义千问,开箱初体验

所有行业、所有应用、所有服务都值得基于新型人工智能技术重做一遍&#xff0c;在带来创造性客户体验的同时&#xff0c;生产范式、工作范式、生活范式也将发生变化。——阿里集团董事会主席兼CEO 张勇 2023阿里云峰会上&#xff0c;通义千问大语言模型对外发布&#xff0c;宣称…

JAVA环境变量配置步骤及测试(JDK的下载 安装 环境配置教程)

目录 一&#xff1a;JDK的下载、安装和配置 JDK 压缩包版的安装 JDK 安装版的安装 二&#xff1a;环境变量配置步骤 三&#xff1a;测试 四、Eclipse安装 已对此文进行更新&#xff0c;请到新文发布地址&#xff1a;https://rej177.blog.csdn.net/article/details/131565…

SpringBoot通过获取请求参数或者Headers上的特殊标识实现i18n国际化

实现效果 我们大部分都是把i18n的标识放在Headers上面&#xff1b;而把标识放在参数上的话比较少&#xff0c;放参数上的话一般是在使用a标签下载某些文件不好配置请求头的时候才使用上 配置在Headers上面&#xff1a; 配置在params上面&#xff1a; 配置代码&#xff1a; /**…

ChatGPT Prompting开发实战(一)

第7章 ChatGPT Prompting开发实战 7.1 Prompting在LangChain框架中的应用 本节跟大家讲提示工程(Prompt Engineering),主要基于工业级的源码以及具体的项目,无论是工程人员,还是不具有技术背景的人员,大家多少都听说过提示词,或者频繁使用过,简单而言,当我们使用OpenA…

CleanMyMac X4.13中文版mac电脑优化加速工具

CleanMyMac X 可以卸掉系统的额外负担 让您的电脑明显提速 不要再因为运行缓慢的 Mac 而拖慢您的效率。CleanMyMac X已经正式发布&#xff0c;作为最新的系统清理和应用管理软件&#xff0c;可以让用户一键智能化清理Mac电脑&#xff0c;自动扫描Mac上的所有文件&#xff0c;包…

谈谈mysql——主从模式下的同步方式及半同步、MGR的部署方式

MySQL的复制模式 异步复制 MySQL的复制方式默认是异步的&#xff0c;主从复制涉及三个线程 master I/O master I/O线程负责写入Binlog&#xff0c;并将执行结果返给客户端&#xff0c;至于Binlog有没有被IO线程读取&#xff0c;读取后有没有重放&#xff0c;重放有没有成功&…

数据库之表的创建及数据类型

目录 创建表 简单语法&#xff1a; 固定格式&#xff1a; 案例 数据类型 文本类型 文本型 字符串型 二进制文本 枚举型 集合型 数字类型 整数型 浮点型 Date类型 DATE()日期 DATETIME() 日期和时间的组合 TIMESTAMP() 时间戳 TIME() 时间 YEAR() 2 位或 4 位…

低代码平台的价格范围及购买成本分析

Zoho Creator是一款强大而灵活的低代码应用程序开发平台&#xff0c;可帮助企业快速、高效地创建各种应用程序。但是&#xff0c;很多人可能会担心它的价格问题。在这篇文章中&#xff0c;我们将深入探讨Zoho Creator的定价策略和计划&#xff0c;以帮助您更好地理解其价格结构…

Android Studio 和 Android Gradle 插件的已知问题

Android Studio 的已知问题 渲染 Compose 预览时出错 从 Android Studio Chipmunk 开始&#xff0c;如果您在问题面板中看到 java.lang.NoSuchFieldError: view_tree_saved_state_registry_owner 或 java.lang.ClassNotFoundException: androidx.savedstate.R$id&#xff0c;…

SIP 协议的主要流程

目录 SIP 协议的呼叫模型图 基本呼叫建立流程 基本呼叫拆除流程 经过代理的呼叫建立流程 经过代理的呼叫拆除流程 SIP 协议在软交换 SoftX3000&#xff08;华为推出的一个支持sip协议的交换机设备&#xff09; 流程图 SIP 协议的呼叫模型图 MGC 负责将 PSTN 前向信令映射…

51单片机--点亮LED灯和流水灯

文章目录 前言LED模块的原理点亮一个LED灯LED灯的闪烁LED流水灯 前言 大家好&#xff0c;这里是诡异森林。我使用的是普中科技的A2的51开发板&#xff0c;适合新手入门。用到的应用是Keil5和Stc-isp&#xff0c;第一个软件主要用来写代码的&#xff0c;第二个是将代码程序输送…

宝塔 安装/使用Apollo(阿波罗)参数配置中心-图文小白教程

官方安装教程手册&#xff1a;Apollo apollo&#xff08;阿波罗&#xff09;是一款可靠的分布式配置管理中心&#xff0c;诞生于携程框架研发部&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的…