算法分析——最接近点对问题

分治法-最接近点对问题 背景: 计算机应用中经常采用点、圆等简单的几何对象表示物理实体,常需要了解其邻域中其他几何对象的信息 例如:在空中交通控制中,若将飞机作为空间中的一个点来处理,则具有最大碰撞危险的两架飞机所处的点对,就是这个空间中距离最接近的一对点。 这类问题是计算几何学中研究的基本问题之一。 我们着重考虑平面上的最接近点对问题。 最接近点对问题: 给定平面上的n个点,找出其中的一对点,使得在n个点组成... 阅读详情
AI摘要

本文介绍了如何使用分治策略解决一维和二维最接近点对问题,包括一维问题的简单处理和二维问题中跨边界归并的解决方案,以及利用鸽舍原理优化查找过程。

问题描述

在现实世界中,涉及点、圆等几何对象的问题,往往需要了解邻域中其他几何对象的信息。如,判断空中飞行的两架飞机是否有碰撞危险,我们可以将飞机近似为点,它们的最小安全距离就是我们的求解目标,这类问题在计算几何学中被称为最接近点对问题。

当然,我们可以通过遍历的方式来解决这类问题:依次求出平面上散落点两两之间的距离,通过排序找到最近接点对。

这样有个明显的问题:算法的时间复杂度T(n)=O(n(n-1)/2)=O(n^2),为了提高计算效率,考虑通过分治法解决问题。

一维最接近点对问题

一维最接近点对问题的解决很简单,利用分治策略将点集S划分,求出最邻近点对后逐步合并。当问题规模为n/2时,也就是S被划分为两个子集p和q,并找到其各自的最小点对时无需再将问题合并,只用比较分界线两侧的点距和min\{min(p),min(q)\},较小值即为所求的最接近点对。

核心代码如下:

Pair Cpair(float s[],int l,int r)  
{  
    Pair min_d={99999,0,0};//最短距离  
  
    if(r-l<1) return min_d;  
    float m1=Max(s,l,r),m2=Min(s,l,r);  
  
    float m=(m1+m2)/2;//找出点集中的中位数  
  
    //将点集中的各元素按与m的大小关系分组  
    int j = Partition(s,m,l,r);  
  
    Pair d1=Cpair(s,l,j),d2=Cpair(s,j+1,r);//递归  
    float p=Max(s,l,j),q=Min(s,j+1,r);  
  
    //返回s[]中的具有最近距离的点对及其距离  
    if(d1.d<d2.d)  
    {  
        if((q-p)<d1.d)  
        {  
            min_d.d=(q-p);  
            min_d.d1=q;  
            min_d.d2=p;  
            return min_d;  
        }  
        else return d1;  
    }  
    else  
    {  
        if((q-p)<d2.d)  
        {  
            min_d.d=(q-p);  
            min_d.d1=q;  
            min_d.d2=p;  
            return min_d;  
        }  
        else return d2;  
    }  
}  

二维最接近点对问题

现在将一维问题拓展,思考寻找平面上最接近点对。

大部分操作同一维问题,重难点在于“跨越分界线”归并问题。令d=min\{dl,dr\},若存在跨越界线的最接近点对,则这两个点一定落在以分界线为中线,d\times 2d的矩形区域内;由鸽舍定理,这个矩形区域内最多只存在6个点。那具体是哪6个点呢?为了解决这个问题,我们可以将p和P中所有S2的点投影到垂直线l上。由于能与p点一起构成最接近点对候选者的S2中点一定在矩形R中,所以它们在直线l上的投影点距p在l上投影点的距离小于d。由上面的分析可知,这种投影点最多只有6个。因此,若将q和p中所有S的点按其y坐标排好序,则对q中所有点,对排好序的点列作一次扫描,就可以找出所有最接近点对的候选者,对q中每一点最多只要检查p中排好序的相继6个点。

具体算法如下:

bool Cpair2(PointX X[], int n,PointX& a,PointX& b,float& d)  
{  
    if(n<2) return false;  
  
    PointX* tmpX = new PointX[n];  
    MergeSort(X,tmpX,0,n-1);  
  
    PointY* Y=new PointY[n];   
    for(int i=0;i<n;i++) //将数组X中的点复制到数组Y中  
    {   
        Y[i].p=i;  
        Y[i].x=X[i].x;  
        Y[i].y=X[i].y;  
    }   
  
    PointY* tmpY = new PointY[n];  
    MergeSort(Y,tmpY,0,n-1);  
  
    PointY* Z=new PointY[n];  
    closest(X,Y,Z,0,n-1,a,b,d);   
  
    delete []Y;   
    delete []Z;  
    delete []tmpX;  
    delete []tmpY;  
    return true;   
}  

小结

以上就是最接近点对问题的分析和解决思路。附鸽舍原理推导过程链接:

鸽舍原理_知乎icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/588737795

递归与分治 | 2:最接近点对问题 —— 例题:套圈 耐心整理的精品笔记,花点时间耐心看完,相信会有收获 ^_^ ) 问题:给n个点的坐标,求最近的一对点之间的距离。 解法一:暴力穷举法,将所有点两两距离都算出,最终取最小的值。时间复杂度为 解法二:分治法,下面具体说。时间复杂度为,理论上是最快的方法 一、算法理论 1、分(Divide) 对于最初输入的 n 个点构成的点集S,大致均分成两部分:以所有点的x坐标的中位数mid为界,分为点... 阅读详情

相关推荐

最邻近点对问题(Closest-Pair Problem):一维的分治解法详解

低维时,最邻近点对问题可以利用分治求解。但是网络上相关资料良莠不齐,对于3维甚至难有有价值的参考。最近恰巧梳理了123维最邻近点对问题的相关知识,故在此分享。这是该系列的第一篇,介绍一维情况的分治解法。

Carl_Rabbit的博客 4476

最接近点对问题

问题的提出:给定平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。 方法:分治法。如果组成S的最接近点对的两个点都在S1中或都在S2中,则问题很容易解决。但是,如果这两个点分别在S1和S2中,问题就不那么简单了。 1、一维情形的分治法 可以先把点排好序,然后用一次线性扫描就可以找出最接近点对,但是这种方法无法推广到二维的情形。 首先,分割点m的选取利用S中各点坐标的中位数来作为分割点。用选取中位数的线性时间算法可以在O(n)时间内确定一个平衡的分割点m。这里使用m=[max(

weixin_44469806的博客 4405

华为海思IC笔试通关秘籍:物理/电路/工艺三大方向高频考点解析(附真题)

本文深度解析华为海思IC笔试中物理设计、电路设计和工艺制造三大方向的高频考点与备考策略。针对华为海思IC笔试机考的特点,提供了方向选择建议、核心知识梳理及真题实战技巧,帮助考生构建系统性复习框架,高效备战,提升通关成功率。

mars5的博客 1308

【算法】最接近点对问题(递归与分治)

【算法】最接近点对问题(递归与分治) 题目 【问题描述】给定二维平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。使用递归与分治策略求解二维平面上的最接近点对问题。假设所有点的集合为S,m为S中所有点的x坐标的中位数,垂直线x=m将集合S均匀分割为左右两个子集合S1和S2。 【输入形式】在屏幕上输入点的个数,以及所有点的x和y坐标。 【输出形式】第一次分割时,将所有点集合S分割为左右两个子集合S1和S2,分别输出左右子集合S1和S2,以及所有点集合S的最接近点对的距离以及最接近

Lenard404的博客 3654

从零抓包分析AVDTP:用Wireshark解密蓝牙音频传输全流程

本文详细介绍了如何使用Wireshark抓包工具分析AVDTP协议,解密蓝牙音频传输的全流程。从实验环境搭建到信令交互解析,再到媒体流传输深度分析,逐步揭示蓝牙音频传输的技术本质,帮助开发者深入理解AVDTP协议的工作机制。

sun99的博客 204

景观格局指数计算方法及代表的生态学意义(待补充)

景观指数 斑块密度(PD) 斑块密度(PD)表现某种斑块在景观中的密度,可反映出景观整体的异质性与破碎度[17],公式为PD=NP/A(1)式中NP———斑块数量,个A———景观或斑块的总面积,hm2PD———斑块密度,个/hm2 最大斑块指数(LPI) 最大斑块指数(LPI)用于确定景观中的优势斑块类型,间接反映人类活动干扰的方向和大小,公式为LPI=amaxA×100%(0≤LPI≤100%)(2)式中amax———景观或某一种斑块类型中最大斑块的面积,hm2LPI———最大斑块指数,% 凝聚

soderayer的博客 13万+

分治法编程问题之最接近点对问题的算法分析

 问题描述     在应用中,常用诸如点、圆等简单的几何对象代表现实世界中的实体。在涉及这些几何对象的问题中,常需要了解其邻域中其他几何对象的信息。例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来看待,则具有最大碰撞危险的2架飞机,就是这个空间中最接近的一对点。这类问题是计算几何学中研究的基本问题之一。下面我们着重考虑平面上的最接近点对问题。     最接近点对

junerfsoft的专栏 1万+

Python从0到100(十九):Python标准库初探

哈希函数又称哈希算法或散列函数,是一种为已有的数据创建“数字指纹”(哈希摘要)的方法。哈希函数把数据压缩成摘要,对于相同的输入,哈希函数可以生成相同的摘要(数字指纹),需要注意的是这个过程并不可逆(不能通过摘要计算出输入的内容)。举一个简单的例子,用户注册时我们希望在数据库中保存用户的密码,很显然我们不能将用户密码直接保存在数据库中,这样可能会导致用户隐私的泄露,所以在数据库中保存用户密码时,通常都会将密码的“指纹”保存起来,用户登录时通过哈希函数计算密码的“指纹”再进行匹配来判断用户登录是否成功。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5003

最接近点对问题一维Java算法_最接近点对问题的算法分析

在二维平面上的n个点中,如何快速的找出最近的一对点,就是最近点对问题。一种简单的想法是暴力枚举每两个点,记录最小距离,显然,时间复杂度为O(n^2)。在这里介绍一种时间复杂度为O(nlognlogn)的算法。其实,这里用到了分治的思想。将所给平面上n个点的集合S分成两个子集S1和S2,每个子集中约有n/2个点。然后在每个子集中递归地求最接近的点对。在这里,一个关键的问题是如何实现分治法中的合并步骤...

weixin_26757925的博客 1141

【NVMEM子系统】二、NVMEM驱动框架

该子系统整体架构不算太大,还是比较容易去理解的,下面我们一起去一探究竟!,该子系统主要用于实现EEPROMEfuse等非易失存储器的统一管理。在早期,像EEPROM驱动是存放于目录下,由于没有做到好的抽象,每次需要去访问相应内存空间,都需要去复制几乎一样的代码,去注册sysfs,这是一个相当大的抽象泄露。NVMEM子系统就是为了解决以往的抽象泄露问题。

Donge's Blog 1714

ANSYS WORKBENCH——参数化建模以及参数优化(结果导出为Excel)

目录 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 ​ 注:印记面的创建 5、模型属性设置 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 印记面一般是一个虚拟的区域,参与实际的网格划分,但是只是由于载.

python_AI_fans的博客 1万+

最接近点对问题的算法分析 (转帖)

<br />最接近点对问题的算法分析 <br /> <br />问题描述<br />    在应用中,常用诸如点、圆等简单的几何对象代表现实世界中的实体。在涉及这些几何对象的问题中,常需要了解其邻域中其他几何对象的信息。例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来看待,则具有最大碰撞危险的2架飞机,就是这个空间中最接近的一对点。这类问题是计算几何学中研究的基本问题之一。下面我们着重考虑平面上的最接近点对问题。<br />    最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使得在

I just can not stop 2507

rk3576 点亮 LCD(mipi)

瑞芯微 RK3576 是一款面向中高端 AIoT 市场的 SoC,其 MIPI DSI (Display Serial Interface) 接口在性能和灵活性上相比前代(如 RK3399/RK3568)有显著提升,特别是在物理层协议的支持上更加现代化。相比RK3399 RK3568的mipi 接口少了 8lane,但是RK3576 MIPI DSI 增加更低功耗的 C-PHY。

weixin_35723192的博客 363

【第5周Java算法分析与设计预习作业】分治算法巅峰之作:一维与二维最接近点对问题的深度剖析与工程实践

给定二维平面上nnn个点,要求找出距离最近的两个点。空中交通管制:监测两架飞机是否过于接近,防止空中相撞。物流与路径规划:在海量配送点中寻找距离最近的节点以优化调度。分子动力学模拟:计算粒子间的范德华力,需要频繁寻找最近邻粒子。计算机图形学:碰撞检测(Collision Detection)的基础前置步骤。最接近点对问题不仅是一道算法题,更是一场关于分治哲学的深刻洗礼。一维情形让我们认识到“跨分割线盲区”的存在,确立了合并阶段的必要性。二维情形通过鸽舍原理的绝妙应用,将看似无解的On2。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 329

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2727

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

分治法——最近点对问题

最近点对问题 最近点对问题是利用分治法解决的经典问题之一。 问题描述 设在一个点集S中存在n个点,找出距离最相近的一对点p1和p2,最近点对可能不止一对,输出一对即可。 分析设计 在n个点中找出距离最近的一对点,我们首先可以想到的方法就是暴力穷举的方法:遍历整个点集,计算每一对点之间的距离d,就能找出最短距离dmin。 显然这样的方法时间复杂度为O(n2),时间复杂度太高,若问题规模较大,穷举的算...

Mr.DImple的博客 3419

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最接近点对问题(递归与分治)

算法分析与设计的一次实验题,因为输出需要输出最接近的点对,所以这里卡住了好久,这里挂一下代码记录一手。 【问题描述】给定二维平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。使用递归与分治策略求解二维平面上的最接近点对问题。假设所有点的集合为S,m为S中所有点的x坐标的中位数,垂直线x=m将集合S均匀分割为左右两个子集合S1和S2。 【输入形式】在屏幕上输入点的个数,以及所有点的x和y坐标。 【输出形式】第一次分割时,将所有点集合S分割为左右两个子集合S1和S2,分别输出左右子

m0_57105024的博客 2073

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【LeetCode】16. 最接近的三数之和

这道题要求从数组中找出三个数,使其和最接近目标值。核心解法是排序+双指针:先排序数组,然后固定一个数,用双指针寻找另外两个数,计算三数之和与目标的差值,不断更新最接近值。时间复杂度为O(n²),空间复杂度O(1)。关键优化包括跳过重复元素和剪枝处理。该算法适用于数值逼近、优化问题等场景,是经典的双指针应用范例。

qq_32019341的博客 1040

二维最接近点对问题 代码+实验报告

在本次实验中,通过研究二维最接近点对距离问题,我深入理解了分治算法的思想,并对其在实际问题中的应用有了更深入的认识。首先,分治算法是一种非常重要且广泛应用的算法思想,它将一个大问题划分 为多个小问题,然后递归地解决这些小问题,并将它们的解合并起来得到最终的结果。在二维最接近点对距离问题中,我将问题划分为两个子问题,分别在左右两个子集中求解最接近点对距离,然后通过合并步骤来求解跨越两个子集 的最接近点对距离。其次,分治算法的关键在于如何将问题划分为更小的子问题,以及如何将子问题的解合并起来。

JK_2966YQ的博客 1194

算法分析上机作业

算法实现代码 算法测试代码 实验二 算法实现与测试代码 实验三 算法实现代码 算法测试代码 实验四 算法实现与测试代码 实验报告 实验一 问题描述 给定由n个数组成的集合S,从中找出最接近S的中位数的n/4个元素。请设计一个最坏情况下时间复杂度为O(n)的算法。解决这个问题之前需要先找到线性时间内解决选择问题(在n个数中选择第k个顺序统计量)的算法,而算法导论中已经给出了期望时间为线性的选择算法和最坏情况下为线性的选择算法。在假设已经获得线性选择算法后只需计算集合的中位数,而后计算集合中各元素与中位数

最佳损友1020的博客 1428

剑指leetcode—最接近的三数之和

题目描述:给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2). 这题和三数之和有着异曲同工之妙 算法分析 首先是特别判断,如果数组为空,或者数组小于三个数,则返回0. 排序数组 初始化一个ans表示最初的三.

super_优快云er的博客 455

01:查找最接近的元素

本题地址:http://noi.openjudge.cn/ch0111/01/ 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个非降序列中,查找与给定值最接近的元素。 输入 第一行包含一个整数n,为非降序列长度。1 <= n <= 100000。 第二行包含n个整数,为非降序列各元素。所有元素的大小均在0-1,000,000,000之间。 ...

Is_ever的博客 1174
上一篇: 算法分析——汉诺塔问题
下一篇: 动态规划——图像压缩
Zephyr .
博客等级 码龄5年 29粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值