学习记录 《常用算法大全》 分治算法 距离最近得点对

「分治法」最近点对距离问题 一、问题描述 给定平面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的平方) 阅读详情

学习记录 《常用算法大全》 分治算法 距离最近得点对

输入点的坐标,输出距离最小的点和距离

1。如果点的书目较小,则直接比较
2。如果数目较大,则分成两个部分A,B
3。求A,B中的最近点对
4。求A,B中各有一点的点对的距离最小者
5。在3,4中求出的三个点对中取最小的

代码:
(error:4)

ClosestPoints.cpp
//////////////////////////////////////////////////
//
//输入点的坐标,输出距离最近的点对
//
//////////////////////////////////////////////////
#include<math.h>
#include "Merge.h"
//#include "points.h"
//数据类型1:按x排序的点
class Point1{
// friend float dist(const Point1&, const Point1&);
// friend void close(Point1*, Point2*, Point2*, int, int, Point1&, Point1&, float&);
// friend bool closest(Point1*, int, Point1&, Point1&, float&);
// friend void main();

public:
int operator <= (Point1 a)const{return (x<=a.x);}

//private:
int ID;
float x,y;
};
//数据类型2:按y排序的点
class Point2{
// friend float dist(const Point2&, const Point2&);
// friend void close(Point1*, Point2*, Point2*, int, int, Point1&, Point1&, float&);
// friend bool closest(Point1*, int, Point1&, float&);
// friend void main();

public:
int operator <= (Point2 a)const{return (y<=a.y);}

//private:
int p; // 数组X中相同的索引
float x,y;
};

//计算两点距离
template<class T>
inline float dist(const T& u, const T& v){
float dx = u.x-v.x;
float dy = u.y-v.y;
return sqrt(dx*dx + dy*dy);
}
void close(Point1 X[], Point2 Y[], Point2 Z[], int l, int r, Point1& a, Point1& b, float& d){
if(r-l ==1){
a = X[l];
b = X[r];
d = dist(X[l], X[r]);
return;
}
if(r-l ==2){
float d1 = dist(X[l], X[l+1]);
float d2 = dist(X[l+1], X[r]);
float d3 = dist(X[l], X[r]);

if(d1 <=d2 && d1 <=d3){
  a = X[l];
  b = X[l+1];
  d = d1;
  return;
}
if(d2<=d3){
  a = X[l+1];
  b = X[r];
  d = d2;
  return;
}
else{
  a = X[l];
  b = X[r];
  d = d3;
}
return;
}
//多于三个点,划分为两部分
int m = (l+r)/2;
//分别在两个部分按y排序建表
int f=l, g= m+1;
for(int i=l; i<=r; i++)
if(Y.p>m)
  Z[g++]=Y;
else
  Z[f++]=Y;
//递归求解以上两部分
close(X, Z, Y, l, m, a, b, d);
float dr;
Point1 ar, br;
close(X, Y, Z, m+1, r, ar, br, dr);
if(dr<d){
a = ar;
b = br;
d = dr;
}
Merge(Z, Y, l, m, r);//恢复(重构)Y[]

//分开的两边的点的距离 与 之前的两部分中最短距离比较
int k = l;
for(i = l; i<= r; i++)
if(fabs(Y[m].x-Y.x)<d)
  Z[k++] = Y;//x距离小于d的点放入Z
for(i=l; i<k; i++){
for(int j=i+1; j<k && Z[j].y-Z.y<d; j++){//比较y距离小于d的点
  float dp = dist(Z, Z[j]);
  if(dp<d){
  d = dp;
  a = X[Z.p];
  b = X[Z[j].p];
  }
}
}
}
bool closest(Point1 X[], int n, Point1& a, Point1& b,float& d){
//在n>=2个点中寻找最近的点对
//如果少于两个点,则返回false
//否则, 在a和b中返回距离最近的两个点
if(n<2)return false;

//按x排序
MergeSort(X, n);

//创建一个按y排序的点数组
Point2 *Y = new Point2[n];
for(int i=0; i<n; i++){
Y.p = i;
Y.x = X.x;
Y.y = Y.y;
}
MergeSort(Y, n);

Point2* Z= new Point2[n];

//寻找最近点对
close(X, Y, Z, 0, n-1, a, b, d);

delete []Y;
delete []Z;
return true;
}
void main(){}

Merge.h
#ifndef MERGE_H
#define MERGE_H
/*
template<class T>
void MergeSort(T a[], int n);
template<class T>
void MergePass(T x[], T y[], int s, int n);
template<class T>
void Merge(T c[], T d[], int i, int m, int r);*/

template <class T>
void Merge(T c[], T d[], int l, int m, int r){
int i = l;
int j = m+1;
int k = l;

//只要存在i和j,则不断归并
while((i<=m)&&(j<=r))
if(c<=c[j])
  d[k++] = c[i++];
else
  d[k++] = c[j++];

//考虑余下的部分
if(i>m)
  for(int q = j; q<=r; q++)
  d[k++] = c[q];
  else
  for(int q = i; q<=m; q++)
  d[k++] = c[q];
}
template <class T>
void MergePass(T x[], T y[], int s, int n){
int i= 0;
while(i<=n-2*s){
Merge(x, y, i, i+s-1, i+2*s-1);
i= i+2*s;
}
if((i+s)<n)Merge(x, y, i, i+s-1, n-1);
else for(int j=i; j<n-1; j++){
y[j]=x;
}
}
template <class T>
void MergeSort(T a[], int n){
T *b = new T[n];
int s=1;
while(s<n){
MergePass(a, b, s, n);
s+ = s;
MergePass(b, a, s, n);
s+ = s;
}
}

#endif

 

Tags: 分治算法  

 

C++用蛮力法与分治法解决最近对问题 设 p1(x1,y1),p2(x2,y2),……,pn(xn,yn)是平面上n个点构成的集合S,最近对问题就是找出集合S中距离最近的点对。严格地讲,最接近点对可能多于一对,简单起见,只找出其中的一对即可。 阅读详情

相关推荐

分治算法解决最近对问题

分治算法解决最近对问题 1. 问题 设P1(x1, y1),P2(x2, y2),P3(x3, y3), P4(x4, y4) …,是平面上n个散列点构成的集合S,最近对问题就是找出集合S中距离最近的点对。 2. 解析 将集合S分成两个子集S1和S2,每个子集中有n/2个点。然后在每个子集中递归地求其最接近的点对,在求出每个子集的最接近点对后,在合并步中,有两种可能: ① 集合S 中最接近的两...

weixin_43750332的博客 1230

最近邻算法(KNN算法)

最近邻算法(KNN算法)

abc1234564546的博客 1万+

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

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

AKGWSB 's blog 1万+

机器学习十大经典算法之KNN最近邻算法

KNN简介 KNN(K-NearestNeighbor)是机器学习入门级的分类算法,非常简单。它实现将距离近的样本点划为同一类别;KNN中的K指的是近邻个数,也就是最近的K个点 ;根据它距离最近的K个点是什么类别来判断属于哪个类别。 KNN算法步骤 我们有一堆样本点,类别已知,如下图左,蓝色为一类,黄色为另一类。现在有个新样本点,也就是图中黑色的叉叉,需要判断它属于哪一类。 KNN做的就是选出距离目标点黑叉叉距离最近的k个点,看这k个点的大多数颜色是什么颜色。这里的距离用欧氏距离来度量。 给定两个样本 X=

Wenrui Xie的博客 2147

算法设计与分析——最近点对问题

最近点对问题、算法设计与分析、C语言算法、JavaScript算法

A_FLY_User的博客 4600

使用PlotNeuralNet绘制深度学习网络图的基本操作

使用PlotNeuralNet绘制深度学习网络图的基本操作

weixin_46877907的博客 2114

【算法】哪两个点之间的距离最近(穷举法)

设P={(x 1​ ,y 1 ),(x 2​ ,y 2 ),⋯,(x n​ ,y n​ )}是平面上散列的n个点的集合。请编写程序找出集合中距离最近的点对。严格地说,相同距离的最近点对可能不止一对,为了简单期间只找出第一对最近点对即可。输入格式: 输入第一行给出一个正整数n,表示平面上的点数。随后n行,每行给出一个实数对,每个实数对表示一个点的纵横坐标值,其中第1数表示横坐标,第2数表示纵坐标。输出格式: 输出最近点对中两个点的坐标和它们之间的距离。如果 x1+y1...

weixin_52078305的博客 2428

ECMWF等大气数据批量下载(Python API)详细步骤

ECMWF等大气数据批量下载(Python API) 遥感方向做热红外温度反演,不可避免的要用到大气廓线数据,大气数据具有实时性,比如2018年9月1日的早上8点的影像,为了提高反演精度就需要用到时间上与其相差尽可能接近的大气数据,用于消除大气的影响,如果数据量较少我们可以查看影像的时间和空间范围进行下载,但是如果处理某个较大区域时可能涉及到大量的影像,如果一景一景对应查找去下载会很麻烦,因此针对大量数据的自动批量下载很有必要。本文根据 https://cds.climate.copernicus.eu/#

liuxiaojiangtobeno1的博客 1万+

热点算法

点在路上,不知道有多少个热点,所以K无法确定,不是KMEANS也不是K均值 有好多个点,第一次这个A点为热点记为1,然后在一定距离内,下一次经过这个点附近,叫做B,取AB中间的一个点,记为C,把C记作2,再经过一个点D,取CD之间的一个点E,记为3,(此时CD权重不同,C的权重大,离C近).以此类推,只是一个距离最近的算法

huizhejian的博客 2478

AI+AB测试提升电商主图点击率实战指南

在电商运营中,主图点击率(CTR)是衡量商品吸引力的核心指标,直接影响转化率和订单增长。通过AI技术批量生成高质量主图素材,结合数据驱动的AB测试方法,可以显著提升点击率。AI工具如MidJourney和Stable Diffusion能够快速生成多样化视觉方案,而自动化处理流水线则确保素材规格统一。AB测试体系通过多维变量控制和流量分配策略,科学验证不同素材效果。这种方法特别适用于需要快速迭代的电商场景,某女装店铺案例显示CTR从1.2%提升至3.8%,验证了AI+数据协同优化的技术价值。

weixin_29058331的博客 299

从0到1搭建StarRocks3.4.1存算一体架构(VM 虚拟机版)

本文详细介绍了如何在VM虚拟机上从零搭建StarRocks 3.4.1存算一体架构。首先阐述了StarRocks作为高性能分布式SQL数据仓库的优势,重点讲解了其存算一体架构的设计原理。随后提供完整的安装指南,包括环境准备(3台CentOS 8虚拟机配置)、网络互通验证、Java环境配置、软件包解压安装等关键步骤。文章特别详细说明了FE和BE节点的配置文件修改(fe.conf和be.conf)以及必要的防火墙端口开放配置。通过图文并茂的方式,帮助开发者和运维人员快速掌握StarRocks集群部署方法,为后续

小 tom的博客 1334

给定平面上N个点的坐标,找出距离最近的两个点(Java)

给定平面上N个点的坐标,找出距离最近的两个点(Java) 说实话这道题不太会,以下讲解转自一篇博客,代码转自另一篇(真是太菜了没脸见人了。。。) 问题:平面点集求其中距离最近的两个点及其距离。 思路:采用分治法,将“求n个点之间最小距离”问题划分为很多个“求n/t个点之间最小距离”问题。 (1)将lstPoint根据X坐标由小到大排序得到点集pointsSortedX,方法很多,冒泡、选择、插入、...

滑技工厂的博客 8827

LangGraph的容错机制:从节点失败到图级回滚

核心概念铺垫:讲解LLM应用容错与事务性的核心概念(幂等性、重试策略、降级策略、快照、回滚、原子性、一致性、隔离性、持久性、最终一致性),对比LangGraph容错机制与传统数据库ACID事务、Apache Airflow/Kubernetes Workflow/Kubeflow Pipelines容错机制的异同;LangGraph容错机制的演进历史:用markdown表格梳理LangGraph从0.0.1到1.5.0(截止202X年X月)的容错机制发展历程;节点级别的容错:重试与降级。

AI Python 编程之道的博客 175

分治算法求最近点对

http://acm.hdu.edu.cn/showproblem.php?pid=1007          先说下题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半。第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标,实数。       这个题目其实就是求最近点对的距离。《算法导论》上有详细讲解,王晓东的书上也有代码。主要思想就是分治。先把n个点按x坐标排序,

Hackbuteer1的专栏 2万+

Ubuntu 22.04 上 Mezzanine CMS 完整安装指南

CMS(内容管理系统)是构建博客、企业官网等静态与动态内容混合站点的核心技术栈;Django 作为 Python 生态中最成熟的 Web 框架,凭借其 ORM、Admin 和安全机制,成为 CMS 开发的首选基础。Mezzanine 是基于 Django 的轻量级 CMS,以开箱即用、零配置多语言和内置 SEO 工具为特色,特别适合中小项目快速落地。在 Ubuntu 这类强调稳定性的服务器操作系统上部署时,关键挑战并非代码逻辑,而是系统层依赖协同——如 Python 版本锁定、SQLite FTS5 支持、

weixin_33508411的博客 304

浅谈云计算01 | 云计算服务的特点

在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。

时光札记 1120

《算法导论》实验五:最近点对算法(C++)

最近点对问题: 在n>=2个点的集合Q中寻找最近点对。 “最近”是指通常意义下的欧几里得距离:即点p1(x1,y1)和p2(x2,y2)之间的距离为:sqrt((x1-x2)2 +(y1-y2)2)。

allin_allin的恋爱小屋 2万+

手把手教你学Simulink——基于全桥 LLC 谐振变换器的双向 DC-DC 建模与仿真

本文详细介绍了基于Simulink的双向全桥LLC谐振变换器建模与仿真方法。内容涵盖:1)LLC谐振变换器背景与双向化挑战;2)系统架构设计及关键数学推导(FHA增益分析、双向控制逻辑);3)Simulink建模步骤(功率级搭建、PWM生成、同步整流实现);4)仿真结果分析(正向/反向工作验证、ZVS特性);5)工程实践建议(增益微调、代码生成与HIL测试)。通过手把手教学,帮助读者掌握950V↔48V双向LLC变换器的完整设计流程,实现高效率能量双向流动的同时保持软开关特性,适用于储能系统、车载充电等应用

MHD0815的博客 179

分治算法解决最短距离问题

分治算法解决最短距离 题目:题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入格式 第一行:n;2≤n≤200000 接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。 输出格式 仅一行,一个实数,表示最短距离,精确到小数点后面4位。 输入输出样例 输入 #1 3 1 1 1 2 2 2 输出 #1 1.0...

JobinXin的博客 5241

VB摄像头监控

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

分治法求最小点对(hdu1007)

先说下题意,很简单,给n个点的坐标,求距离最近的一对点之间距离的一半。第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标。实数。 这个题目其实就是求最近点对的距离。《算法导论》上有详细讲解,王晓东的书上也有代码。主要思想就是分治。先把n个点按x坐标排序,然后求左边n

___简言 1万+

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

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

【分治法】求最近点对问题

最近点对 对平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短距离的两点 思路 暴力思路: 使用双重for循环,遍历平面中的所有点对并计算距离,通过比较得到最短距离,时间复杂度为O(N2) 分治法求解: 划分: 根据坐标x对平面上的所有点进行排序(x相同则比较y),排序便于随后的划分 在平面上对所有点不断进行二分,当剩余一个点和两个点时可以直接求解,剩余一个点时,距离为∞,剩余两个点时可以直接计算距离。 二分过程中记录左右两部分中的最短距离dist1和dist2

九筒的博客 4128

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【分治法】最近点对问题(一维+二维)

问题描述 设p1=(x1, y1), p2=(x2, y2), …, pn=(xn,yn)是平面上n个点构成的集合S,最近对问题就是找出集合S中距离最近的点对。 严格地讲,最接近点对可能多于一对,简单起见,只找出其中的一对作为问题的解。 求解思路 用分治法解决最近对问题,很自然的想法就是将集合S分成两个子集 S1和 S2,每个子集中有n/2个点。然后在每个子集中递归地求其最接近的点对,在求出每...

欢迎来到关关雎鸠儿的博客 5352

算法分析与设计——最近点对问题

【问题描述】最近对问题要求在包含有n个点的集合S中,找出距离最近的两个点。设 p1(x1,y1),p2(x2,y2),……,pn(xn,yn)是平面的n个点。严格地将,最近点对可能不止一对,此例输出一对即可。 【基本算法思想】暴力法:在蛮力法实现最近点对问题中,将问题简化:距离最近的点对可能多于一对,找出一对即可,另外只考虑二维平面中的情况。此处考虑到直接用公式计算其距离(欧几里得距离): 通过遍历

fanleehao的博客 4万+

分治算法——求逆序对、n个点中求最近的两个点的距离、快速求解两个矩阵的乘积

分治算法:分而治之。也就是将原问题划分为n个规模较小的子问题,并且结构与原问题相似,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。 关于递归是否可以换成循环处理,我在处理实际问题的时候,试过,可行。所以还得要具体问题具体分析。 一、求逆序对 #include<iostream> using namespace std; static int num = 0; ...

优快云的博客 1067

算法丨Python实现分治法解决最近对问题

分治法解决最近对问题Python实现

日常学习记录 1367
上一篇: JSP中filter过滤器验证用户登录
下一篇: JScript中的隐式变量声明和var变量声明
JavaAlpha
博客等级 码龄18年 910粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值