找最近点对问题-分治算法的应用

「分治法」最近点对距离问题 一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方) 阅读详情

 

    分治算法的基本思想是:
    分(divide):递归求解子问题,即:分解+求解,将问题分解为k个方便求解的小问题。
    为什么说是递归求解呢,这里可以看作将一个问题分2个子问题,如果2个子问题还是大,再继续分成4个子问题,直到分解到能方便求解的小问题。也就是说分治算法是含有2个以上的递归运算,只有一个递归的例程不能算做分治算法。
    治(conquer):从子问题构建原问题的解。
    对于分治,最长用到的复杂度分析情况为:
    T(N) = aT(N/b) + O(N^k)
    当a=b^k时, T(N)=O(N^k*logN)
    比如,非常常见的二分法: T(N) = 2T(N/2) + O(N) ,此时a=2, b=2, k=1 即a=b^k,所以 该算法的复杂度为 O(NlogN)
     从另一个角度,反向分析问题,如果我们希望得到一个O(NlogN)的算法,那么就需要保证附加工作为O(N),这是一个非常非常关键的利用分治算法解决问题的入手点!!!
    而且这个复杂度也是大多数分治算法问题的情况。 当然还有另外两种>, < 情况,就参考书上的详细讲解吧。
    
    下面以一个例子详细介绍如何应用分治算法。
    最近点对问题:给定平面上的N个点,找出距离最近的两个点。
    对于该问题,算法过程并不算复杂,但要想编程实现,需要克服不少细节问题。
    首先应该实现Point类:
     Point.h:
#include <iostream>
class Point
{
public :
    Point( double x , double y);
    double getx() const
    {
        return m_x;
    }
    double gety() const
    {
        return m_y;
    }
    friend std :: ostream & operator <<( std :: ostream & os , const Point & p);
   
private :
    double m_x;
    double m_y;
};
    Point.cpp:
#include "Point.h"

Point :: Point( double x , double y) : m_x( x ), m_y( y)
{
}

std :: ostream & operator <<( std :: ostream & os , const Point & p)
{
    os << "P(" <<p . getx() << "," <<p . gety() << ")";
    return os;
}
 
    这里有几点要注意:重载<<,友元函数的应用,初始化的位置。不多介绍了,代码很简单,上点心看看就好。 
    接下来,是解决该问题的具体过程:
    1. 最简单的解法就是蛮力法:把每两个点的距离求出来,然后找出最小值即可。
       虽然,该算法很简单,但编程实现时,从该笨方法起步会有一个很好的过渡,不至于编码难度过陡。
       于是我们需要:计算两点距离的函数 Distance, 求最近点对函数 FindShortPair, 一组点 Point p []用以测试, 打印点函数 PrintPoints用于观察。
       代码如下:       上面的代码完成了很多该问题算法的外围工作,最重要的是提供了测试环境。注意const的应用,double,int型的定义。
#include "Point.h"
#include <cmath>

double Distance( const Point & s , const Point & t)
{
    double squarex = ( s . getx() - t . getx() ) * ( s . getx() - t . getx() );
    double squarey = ( s . gety() - t . gety() ) * ( s . gety() - t . gety() );
    return sqrt( squarex + squarey );
}

void FindShortPair( const Point * p , int num)
{ //can only find one of the shortest path
    double distance = Distance(p [ 0 ], p [ 1 ]);
    int start = 0;
    int end = 1;
    for ( int i = 0; i < num; i ++)
    {
        for ( int j = i + 1; j < num; j ++)
   &nbs
分治——最近点对问题 利用分治方法的经典问题——最近点对问题(Closest pair of points problem) 问题描述 n个点在公共空间中,求出所有点对的欧几里得距离最小的点对。 问题分析 该题直观的解决方法便是Brute Force(暴力求解)。时间复杂度为O(n2)O(n^2)O(n2)。 minDist = infinity for i = 1 to length(P) - 1 for j... 阅读详情

相关推荐

分治法求最近点对 (深大算法实验2)报告+代码

所有实验的资源 链接: https://pan.baidu.com/s/1lukZRM3Rsd1la35EyyJcvg 提取码: iv72 目录写在前面问题描述求解问题的算法原理描述分治法分治法的改进:算法核心伪代码测试流程算法测试结果及效率分析总览与对比分治法:特殊情况的测试图形演示对求解这个问题的经验总结代码最近点对图形演示 写在前面 期末终于算法课快要完结了。 这学期算法课可谓是最难顶的课程了,又正好是线上上课,提问互动的机会相对较少,老师上课抛砖引玉,实验内容又比较难,我花了大部分的时间在找算法,

AKGWSB 's blog 1万+

【算法设计与分析】分治法(最近点对问题)

考虑最近点对有可能是上述某次递归调用找出的距离为d的点对,也有可能是SL中的一个点与SR中的一个点形成的点对。在分治开始前,已经对X和Y数组进行递增排序,此时取中间点将点集划分为左区域SL和右区域SR,SL中所有点都在中线上或是在中线的左侧,SR中所有点都在中线上或是在中线的右侧。遍历n个点与剩余n-1个点之间的距离,在计算点对距离时不断更新最短距离的值,遍历完所有点对后即可求得最短点对距离。遍历一点在Y’L中,另一点在Y’R中的所有点对距离,并返回得到的最小点对距离。此方法的时间复杂度为O(n²),

b1ngsha的博客 4050

c语言 分治法求解最近点对问题

最近对问题(二维平面上的点),编程实现用分治法求解。 最近点对算法: double cpair2(S) {       n=|S|;       if (n &lt; 2) return 0; 1)、m=S中各点x坐标的中位数;      //构造S1和S2;      S1={p∈S|x(p)&lt;=m},      S2={p∈S|x(p)&gt;m} 2)、d1=cp...

attack_5的博客 9737

最近点对问题(分治思想的经典应用)

今天开始复习典型算法,首先回顾了分治算法的应用。一个经典的问题是求二维空间中最近点对。如果硬性用循环解决这个问题的话,当点的数量较大时,循环的次数会以O(n2)增加,所以这不是较好的解决方法。对于这种问题,可以通过将原问题不断划分为更小的子问题进而加以解决。在《数据结构、算法与应用-----c++语言描述》一书中给出了这一问题完备的分治递归解决方案。 算法过程如下: 1、如果点的数量n较小,则直

xuanyuansen的专栏 2927

分治法解决最近对问题

用分治算法解决最近对的问题,便于大家学习和交流,共同提高编程水平

算法 最近点对 分治法

这是算法作业,最近点对问题,采用分治策略。资源内包括全部代码,和exe文件。以文件形式读入所有点的位置,文件在Debug文件夹内和exe文件放在一起。

分治法和蛮力法求最近对问题

算法设计实验报告,包括:分治法和蛮力法求最近对问题的基本思想、时间复杂度分析,C++实现代码,两种算法运行时间的比较,运行结果截图,实验心得。

MMCV安装后报错‘from mmcv import Config’?别慌,这是MMCV 2.0的锅!快速降级回退MMCV 1.x全指南

本文详细解析了MMCV 2.0版本升级导致的‘from mmcv import Config’报错问题,提供了从诊断到降级回退MMCV 1.x的完整解决方案。通过pip和OpenMIM工具链的实操指南,帮助开发者快速解决版本冲突,确保项目稳定运行。

weixin_29102619的博客 263

22AP10 SS524 平替 海思HI3521DV200 可提供开发资料

入,突破了数字接口的视频输入性能瓶颈,提供两倍于前代产品的视频输入能力。视频编解码引擎、视频图像处理的算法效果及性能得到了进一步提升。芯片为客户产品提供了高性能、优异图像质量。推理引擎,支持多种智能算法应用。合丰富的外围设备及高速接口,该。解决方案,广泛用于模拟高清。产品应用开发的新一代专。四核处理器和性能强大的。

szhorsway的博客 1011

通信算法之325:无人机云哨协议及发射机接收机仿真算法

【代码】通信算法之325:无人机云哨物理层协议及发射机接收机仿真代码。

leegang12的专栏 362

第78章:PCL Multiple View ICP 多视角配准

多视角配准(Multiple View ICP)是迭代最近点(ICP)算法的扩展,旨在处理多视角的点云数据配准问题。传统的ICP算法主要用于两幅点云之间的配准,而多视角配准则处理来自多个视角或不同时间采集的多个点云数据的配准任务。在实际应用中,多个传感器或多个拍摄角度获得的点云数据常常需要进行联合配准。这些点云可能由于不同的视角、拍摄位置或时间差异而存在位置和旋转的差异。多视角配准的目标是根据多个点云之间的匹配关系,找到它们的相对变换,使得这些点云能够合并成一个统一的三维模型。

yumeiguo的博客 158

Python爬虫实战:利用Playwright+Asyncio高效获取淘宝商品价格变化曲线

本文将详细介绍如何使用Python最新技术栈(Playwright+Asyncio)构建一个高效的淘宝商品价格监控爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、数据存储与分析,最终实现价格变化曲线的可视化展示。文章包含完整的代码实现和详细的技术解析,适合中高级Python开发者学习参考。关键词:Python爬虫、Playwright、Asyncio、淘宝价格监控、数据可视化支持多浏览器(Chromium, Firefox, WebKit)更快的执行速度更丰富的API。

2201_76125261的博客 245

SAP PFCG 中的单一角色与复合角色

在 SAP 系统的安全与授权管理中,事务码 PFCG(角色维护)扮演着关键角色。理解单一角色(Single Role)和复合角色(Composite Role)的概念,对于有效地管理用户权限至关重要。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1477

突破Cloudflare 5秒盾:TLS指纹伪装+Playwright行为模拟,爬虫存活率从35%提至78%

TLS指纹精准识别:Cloudflare会解析客户端的TLS Client Hello包(如SSL版本、密码套件、扩展字段),Python的requests/urllib库的TLS指纹是“黑名单级”,请求一出即被拦截;行为特征检测:静态的浏览器伪装(如User-Agent)已失效,Cloudflare会监控页面加载后的行为(是否有鼠标移动、滚动、点击,行为是否机械);JS环境深度验证:通过WebGL、Canvas、字体渲染、Navigator属性生成浏览器指纹,无头浏览器的默认配置会被瞬间识别;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2360

OceanBase数据库:从入门到精通全栈教程目录(含架构解析、性能调优与实战案例)

《OceanBase数据库专栏》全面解析蚂蚁集团自主研发的分布式关系型数据库,涵盖从基础到高级的完整知识体系。专栏分为入门篇、原理篇、使用篇等七大模块,包含35+篇深度文章,详细讲解OceanBase的高可用架构、Paxos协议、LSM树存储引擎等核心技术。特别提供MySQL/Oracle迁移指南、金融/电商场景实践案例,以及性能调优、运维监控等实战内容。适合开发者、DBA及架构师快速掌握OceanBase的核心特性和行业应用,助力企业实现数据库分布式转型。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 982

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 单源加权图最短路径问题2-BellmanFord算法
下一篇: 所有点对的最短路径-FloydWarshall算法
midgard
博客等级 码龄21年 88粉丝 21原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值