算法设计与分析——递归与分治策略——最接近点对问题

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

【问题描述】
最近对问题要求在包含有n个点的集合S中,找出距离最近的两个点。设 p1(x1,y1),p2(x2,y2),……,pn(xn,yn)是平面的n个点。
在这里插入图片描述

严格地将,最近点对可能不止一对,此例输出一对即可。

【基本算法思想】
暴力法:
在蛮力法实现最近点对问题中,将问题简化:距离最近的点对可能多于一对,找出一对即可,另外只考虑二维平面中的情况。此处考虑到
直接用公式计算其距离(欧几里得距离):
在这里插入图片描述

通过遍历所有点集,计算出每一个点对的距离,计算出最近的距离并输出。避免同一对点计算两次,只考虑i<j的点对(pi,pj)。
其主要循环的步骤就是求出平方值,执行的次数为:

在这里插入图片描述

分治法:
在利用分治法思想解决此问题时,首先考虑将最近对问题进行分治,设计其分治策略。将集合S分成两个子集S1和S2,根据
平衡子问题原则,每个子集中的点数大致都为n/2。这样分治后,最近点对将会出现三种情况:在S1中,在S2中或者最近
点对分别在集合S1和S2中。利用递归分析法分别计算前两种情况,第三种方法另外分析。求解出三类子情况后,
再合并三类情况,比较分析后输出三者中最小的距离。

复杂度分析: 在分治算法中,当求解n个点的集合的最近点对时,对于上述三类情况中的前两者可由递归算得,
而分析可得第三类情况的时间代价 ,合并后问题求解的总的时间按复杂度可由下列公式来:

在这里插入图片描述

//分治法求解最近点对问题(C++)
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct point{           //点结构
    double x,y;
};
double Distance(point a,point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(point a,point b){          //按y升排序辅助函数
    return a.y<b.y;
}
bool cmp2(point a,point b){          //按x升排序辅助函数
    return a.x<b.x;
}
double closestPoint(point s[],int low,int high,point rec[]){
    double d1,d2,d3,d;
    int mid,i,j,index;
    double x1,y1,x2,y2;         //记录点对的位置
    point P[high-low+1],temp1[2],temp2[2],temp3[2];         //辅助空间
    if(high-low==1){             //两个点的情况
        rec[0].x=s[low].x;rec[0].y=s[low].y;
        rec[1].x=s[high].x;rec[1].y=s[high].y;
        return Distance(s[low],s[high]);
        }
    if(high-low==2){            //三个点的情况
        d1=Distance(s[low],s[low+1]);
        d2=Distance(s[low+1],s[high]);
        d3=Distance(s[low],s[high]);
        if((d1<d2)&&(d1<d3)){
            rec[0].x=s[low].x;rec[0].y=s[low].y;
            rec[1].x=s[low+1].x;rec[1].y=s[low+1].y;
            return d1;
        }
        else if(d2<d3){
            rec[0].x=s[low+1].x;rec[0].y=s[low+1].y;
            rec[1].x=s[high].x;rec[1].y=s[high].y;
            return d2;
        }
        else {
            rec[0].x=s[low].x;rec[0].y=s[low].y;
            rec[1].x=s[high].x;rec[1].y=s[high].y;
            return d3;
        }
    }
    mid=(low+high)/2;       //其他情况递归
    d1=closestPoint(s,low,mid,rec);
    temp1[0]=rec[0];
    temp1[1]=rec[1];
    d2=closestPoint(s,mid+1,high,rec);
    temp2[0]=rec[0];
    temp2[1]=rec[1];
    if(d1<d2){
        d=d1;
        rec[0]=temp1[0];
        rec[1]=temp1[1];
    }
    else {
        d=d2;
        rec[0]=temp2[0];
        rec[1]=temp2[1];
    }
    index=0;
    for(i=mid;(i>=low)&&((s[mid].x-s[i].x)<d);i--)      //点集合p1
        P[index++]=s[i];
    for(i=mid+1;(i<=high)&&((s[i].x-s[mid].x)<d);i++)      //点集合p2
        P[index++]=s[i];
    sort(P,P+index,cmp);                    //升序排列
    for(i=0;i<index;i++){
        for(j=j+1;j<index;i++){
            if((P[j].y-P[i].y)>=d)
                break;
            else {
                d3=Distance(P[i],P[j]);
                if(d3<d){
                    rec[0].x=P[i].x;rec[0].y=P[i].y;
                    rec[1].x=P[j].x;rec[1].y=P[j].y;
                    d=d3;
                }
            }
        }
    }
    return d;
}
int main(){
    point p[10];            //设定点的集合
    int n;
    double minDist;
    cout<<"输入点的个数:\n";      //输入点的个数
    cin>>n;
    cout<<"输入点集:(x,y)\n";
    for(int i=0;i<n;i++)
        cin>>p[i].x>>p[i].y;
    sort(p,p+n,cmp2);      //对输入的点先排序
    point index[2];
    minDist=closestPoint(p,0,n-1,index);
    cout<<"最小距离点对为:("<<index[0].x<<","<<index[0].y<<"),("<<index[1].x<<","<<index[1].y<<")\n";
    cout<<"最小距离为:\n"<<minDist;      //输出点对的最小问题
    return 0;
}

————————————————
版权声明:本文为优快云博主「fanleehao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_28666193/article/details/53351482

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

相关推荐

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

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

Carl_Rabbit的博客 4476

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

由于能与p点一起构成最接近点对候选者的S2中点一定在矩形R中,所以它们在直线l上的投影点距p在l上投影点的距离小于d。因此,若将q和p中所有S的点按其y坐标排好序,则对q中所有点,对排好序的点列作一次扫描,就可以找出所有最接近点对的候选者,对q中每一点最多只要检查p中排好序的相继6个点。如,判断空中飞行的两架飞机是否有碰撞危险,我们可以将飞机近似为点,它们的最小安全距离就是我们的求解目标,这类问题在计算几何学中被称为。一维最接近点对问题的解决很简单,利用分治策略将点集S划分,求出最邻近点对后逐步合并。

ACMer_y的博客 2343

计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)

计算机算法设计与分析(第4版) 目录 1 算法概述2 递归与分治策略3 动态规划4 贪心算法5 回溯法6 分支限界法7 随机化算法8 线性规划与网络流 算法概述 复杂性分析NP-完全性理论 递归与分治策略 排列问题:Permutate 注意,递归嵌套在一个函数里,特别选择参数k,k之前的代表已经固定,k之后的依次交换并递归

cteng的专栏 1万+

最接近点对问题

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

weixin_44469806的博客 4405

算法-分治法-最近对问题

蛮力法的最近对问题:https://blog.youkuaiyun.com/qq_40452317/article/details/88040973 用分治法解决问题就是将集合s分为两个集合s1和s2。每个解合都有n/2个点,接着在子集和中递归求解最近的点。 一维情况 为了简单化问题,我们先考虑一维情形,即所有的点都在x轴上(假如顺序是有序的,也可以排好序,为简单,直接输入有序序列),x轴上某个点m将集...

朝歌 1万+

分治法--一维最接近点对问题

1)问题描述 2)基本思路 3)代码实现 package hello; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class fuck { public static void main(String...

weixin_44721537的博客 1775

算法设计与分析——期末复习

算法是解决问题的方法与过程。程序可不满足有限性。

weixin_74746867的博客 464

2026 具身智能 VLA/WAM 全栈学习与训练路线:从动作建模、SFT、RL 到世界模型的 RTX PRO 6000 96GB 单卡实战指南

我会把这张表做成“”而不是只列论文名:先核对每个模型截至的公开代码、训练目标和数据接口,再单独给你一套。对于没有公开、只有推理代码或训练细节不完整的模型,我会明确标出来,避免把“论文里提到”误写成“可复现”。目前有一个重要更新:。截至今天 NVIDIA 官方开源主线已经是换成 Cosmos-Reason2-2B/Qwen3-VL 架构,动作端仍是连续路线,而且官方明确给出单卡微调时默认只训练,峰值显存约。所以你的 96GB 单卡对 GR00T SFT 非常宽裕。可以。下面我按,把它整理成一张真正面向“

u013250861的博客 442

中国矿业大学计科算法导论菜鸟笔记

中国矿业大学计科算法导论笔记

weixin_53711294的博客 1242

【重磅干货】介质损耗因数(tanδ)揭秘:如何精准定位材料劣化最严重的温度?附权威研究PDF!

是评估绝缘材料性能的核心指标,能直接反映材料内部能量损耗和微观结构变化。通过分析tanδ-温度曲线的峰值点,可精准定位材料劣化最严重的温度。:极化损耗峰值的温度点(如环氧树脂的80℃)是材料性能拐点,需重点关注!:图3对比了5种材料的tanδ-温度曲线,峰值温度差异高达50℃!在电力设备、电子元器件等领域,材料的老化与温度密切相关。:[《介质损耗峰值温度在设备寿命预测中的应用》]在不同温度下测量tanδ,绘制曲线图。:[《多材料介质损耗峰值温度对比研究》]:基于tanδ峰值温度开发的。

mubiao05的博客 1349

【大模型】MHA,MQA,GQA及KV Cache详解

在自回归模型中(Autoregressive Models),模型会逐个生成文本的每个token,这个过程可能比较慢,因为模型一次只能生成一个token,而且每次新的预测都依赖于之前的上下文。这意味着,要预测第1000个token,你需要用到前999个token的信息,这通常涉及到对这些token的表示进行一系列矩阵乘法运算。而要预测第1001个token,你不仅需要前999个token的信息,还要加上第1000个token的信息。

酒酿小圆子呀~ 2612

分治策略(二分查找,排列问题,整数划分,合并排序,堆排序,快速排序,线性选择,最大子段和问题)

把规模大的问题,分成规模小的多个问题,逐个解决。把原问题分割成若干问题,且这些子问题是可解的,这些问题可以解决原问题。

2402_84699040的博客 194

android osmdroid 加载常用离线地图格式(开源的在线地图)

osmdroid是(几乎)完整/免费更换为Android MapView(v1 API)类。它还包括一个模块化的瓷砖供应商系统支持众多的在线和离线瓷砖来源和覆盖支持内置覆盖绘制图标,跟踪位置和形状。如果想在你项目中使用osmdroid,绝对是灵活度最高,不用申请百度,高德等的key。还有一堆规则要遵循。osmdroid可以支持多图层叠加,绘制自已的图层。离线加载常用地图格式zip,sqlite,.

mmsx990的博客 1万+

算法设计与分析复习总结(二)

本文主要介绍了递归与分治策略。

m0_74337962的博客 1087

cdk&java | 分子sdf文件生成

sdf

ASKCOS博客 1089

硬件学习手册【总目录】

欢迎大家来到《硬件学习手册》,专栏主要包括 《硬件经验手册》《电子元器件器件手册》《PCB手册》《CPU手册》《元器件选型手册》五个分册。在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。

fydar的博客 5851

常用算法一(分治算法)

一、基本概念    在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……     任何一个可以用计算机求解的问题所需的计算时

Sun19910114的专栏 441

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1117

五大常用算法之一:分治算法

分治算法 一、基本概念    在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……     任何一个可以用计算机求解的问题所需的计

小小段同学 1048

【微电网优化】基于粒子群求解CHP机组、气网、电网、储热罐和电锅炉微电网优化模型附matlab代码

1 简介 我国风力发电近年发展迅速,装机容量已成为全球首位.随着风力发电在电力系统中的渗透率不断提高,我国多个地区(尤其是"三北"地区)已经面临着十分严峻的风电消纳问题,产生不容忽视的弃风问题.针对目前我国风电消纳存在的困难,本文提出粒子群优化CHP机组、气网、电网、储热罐和电锅炉微电网控制策略. 2 部分代码 Ppv=[0;0;0;0;0;0;9.86000000000000;19.0100000000000;33.1000000000000;45.0700000000000;64.7900000

qq_59747472的博客 671

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【算法分析与设计】递归与分治策略

计算机算法分析与设计中有关递归与分治策略的讲解,主要包括学习要点、算法总体思想、递归的概念、分治法

東方緋想天 1536

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

junerfsoft的专栏 1万+

VB摄像头监控

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

最接近点对问题(分治)

最接近点对问题问题描述解题思路及所选算法策略的可行性分析伪代码描述及复杂度分析时间复杂度:部分代码 问题描述 给定平面上n个点,找出其中的一对点,它们之间的距离最小。 解题思路及所选算法策略的可行性分析 先选定一个点,再与其他n-1个点求出距离。找出最小的两点。这样效率太低需要O(n2)计算时间。计算时间下界为(nlogn),可以采用分治法解决此问题。将n个点分成两个n/2个点的集合,再递归求最接...

MP-214的博客 3240

【算法设计与分析】递归与分治策略

本文介绍了递归与分治策略的基本概念和应用。主要内容包括:递归的三要素(基准情况、递归情况、收敛性)及执行过程,比较了递归与迭代的优缺点;分治法的三个步骤(分解、解决、合并)及适用条件,并通过递归树和主定理分析算法复杂度;详细讲解了二分搜索技术,包括迭代和递归两种实现方式。此外还列举了合并排序、快速排序等经典分治算法,为学习更复杂的算法问题奠定基础。

m0_72516377的博客 869
上一篇: 算法设计与分析——递归与分治策略——循环日程赛
下一篇: 算法设计与分析——动态规划——矩阵连乘问题
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值