最近对问题的分治算法(C++)

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

 

#include<stdio.h>
#include
<sstream>
#include 
<map>
#include 
<iostream>
#include 
<math.h>
using namespace std;
#define N 5;
#define M 5000;
typedef  
struct Point
{
 
int x;
 
int y;
} Point;
Point P[
50] ;
int GetNearest(int i,int j)
{  
 
if(i==j-1)
 {
  
return (P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y);
 }
 
else 
 {
  
int mid=(i+j)/2;
  
int n1,n2;
  
if(i<mid)
  {
    n1
=GetNearest(i,mid);    
  }
  
else
  {
   n1
=M;
  }
  
if(j>mid+1)
  {
    n2
=GetNearest(mid+1,j);    
  }
  
else
  {
   n2
=M;
  }
  
int min=n1;
  
if(n2<n1)
  {
   min
=n2;
  }
  
for(int k=i;k<=mid;k++)
  {
   
if(P[k].x>=P[mid].x-n1)
   {
    
for(int l=mid+1;l<=j;l++)
    {
     
if(P[l].x<=P[mid].x+n1)
     {
      
int dis=(P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y);
      
if(dis<min)
      {
       min
=dis;
      }
     }
    }
   }
  }
  
return min;
 }
}
void main()
{  
 
 
for(int i=0;i<50;i++)
 {
  P[i].x
=i;
  P[i].y
=2*i;
 }
 P[
5].x=5;
 P[
5].y=9;
 
int mindis=GetNearest(0,49);

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

相关推荐

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

最近点对问题(分治法)C++代码实现

给定平面上N个点, 请找出这N个点的最近点对。第一行输入M表示包含M组测试数据,每组先输入N (N<=50000), 接着输入N个坐标(x,y), x和y均为int型整数.

m0_62175951的博客 1141

1.3. 分治法—最近点对问题

1. 问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小 2. 求解过程 划分:将集合S分成两个大小基本相等的子集S1S_1S1​和S2S_2S2​ 求解子问题:递归地求解两个子问题 合并问题的解(三种情况) 组成S的最近点对的2个点都在S1S_1S1​中 组成S的最近点对的2个点都在S2S_2S2​中 组成S的最近点对的2个点分别在S1S_1S1​和S2S_2S2​中 3. 算法思路 预排序:把S中的点分别按x坐标值和y坐标值排序 如果S中包含的点少

qq_45069496的博客 6135

C++分治法--最近对问题

最近对问题: 最近对问题要求在一个包含n个点的集合中找出距离最近的两个点。严格地讲,距离最近的点可能多于一个,简单起见,只找出其中的一对即可。 最近对问题的分治策略如下: (1)划分:将集合S分成两个子集S1和S2,根据平衡子问题原则,每个子集中大约有n/2个点,设集合S的最近点对是pi\displaystyle p_ipi​和pj\displaystyle p_jpj​(1≤\displaystyle\leq≤i,j≤\displaystyle\leq≤n),则会出现以下三种情况: 1.pi∈S1\dis

weixin_45395062的博客 4216

C++用蛮力法与分治法解决最近对问题

设 p1(x1,y1),p2(x2,y2),……,pn(xn,yn)是平面上n个点构成的集合S,最近对问题就是找出集合S中距离最近的点对。严格地讲,最接近点对可能多于一对,简单起见,只找出其中的一对即可。

weixin_45970642的博客 3600

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

     分治算法的基本思想是:    分(divide):递归求解子问题,即:分解+求解,将问题分解为k个方便求解的小问题。    为什么说是递归求解呢,这里可以看作将一个问题分2个子问题,如果2个子问题还是大,再继续分成4个子问题,直到分解到能方便求解的小问题。也就是说分治算法是含有2个以上的递归运算,只有一个递归的例程不能算做分治算法。    治(conquer):从子问题构

熟能生巧 1万+

最近点对问题(python实现)

最近用python比较多,想要用python写出一个最近点对查询算法,结果网上找不到,于是自己写了一个,发在这里是供自己以后参考,也是与大家共享,具体思路已经写在代码里,自测是通过的,如果有什么问题,希望大家能够指出来。 ''' 最小点对算法:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小。严格地说,最接近点对可能多于1对。为了简单起见,这里只限于找其中的一对。 主要算法思想:先把所有点按照x值排序,从最中间(x值中位数b)将所有点分为三个部分,左子域(左子域包括中间子域)

我有明珠一颗的博客 5629

分治法实现最近点对问题(C++)

最近点对问题 要求 随机生成30个浮点数(1-10)之间 求出最近距离的两点 C语言实现 #include <iostream> #include <math.h> using namespace std; struct dot{ //点结构 float x; float y; }; void sortByX(dot dots[6],int num){ //将点按照X坐标从小到大排列好(冒泡) for (int i = num-1; i >=

weixin_47389461的博客 2514

c语言分治算法求最近对,分治法求解最近对问题(c++)

#include"stdafx.h"#include#include#define TRUE 1#define FALSE 0using namespace std;typedef struct Node//坐标点{double x;double y;}Node;typedef struct List{Node* data; //点int count; //点的个数}List;...

weixin_26840895的博客 892

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

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

A_FLY_User的博客 4600

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

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

AKGWSB 's blog 1万+

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

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

allin_allin的恋爱小屋 2万+

最近点对问题 分治法证明及两种分治法

问题描述 对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短距离的两点。 暴力法 暴力法的思路相对简单,即枚举所有可能的配对情况,然后一一比对,找到距离最小的点,一共有 Cn2 种组合,也就是 n*(n-1)/2种,总的时间复杂度是O(n^2),因为时间开销过于昂贵,我们寻求别的方法 分治法 问题分割策略:排序,取中位数 如果像快速排序,分割的策略与数据...

AKGWSB 's blog 3024

算法设计与分析 实验二 分治法求解最近点对问题

分治法求解最近点对问题一、实验目的与要求1、实验基本要求:2、实验亮点:二、实验内容与方法三、实验步骤与过程(一)一些准备工作1、实验流程2、数据生成与去除重复点(二)暴力穷举法1、算法描述2、时间复杂度分析3、编程实现(三)分治法1、算法描述2、算法解释与正确性分析3、时间复杂度分析4、编程实现(四)时间效率对比分析四、实验结论或体会五、思考 一、实验目的与要求 1、实验基本要求: (1) 掌握分治法思想。 (2) 学会最近点对问题求解方法。 2、实验亮点: (1)通过暴力法以及分治法详细介绍“最近点对”

上山打老虎的博客 1万+

分治法求解最近点对问题的算法实验实现

最近点对问题(Closest Pair of Points Problem)是计算几何学中的一个经典问题,旨在找到平面上一组点中距离最近的一对点。数学上,假定给定一个点集 P = {p1, p2, …, pn},其中 pi = (xi, yi) 表示二维平面上的点,目标是求解距离 δ(p, q) 最小的点对 (p, q),其中 δ(p, q) 是两个点之间的欧几里得距离。

weixin_29301059的博客 1152

分治算法(最近点对问题的C++实现)

这是一个解决最近点对问题的很好的范例!

算法上机(二)C语言用分治算法解决最近点对问题

最近点对问题 二维空间上有很多个点,每个点的坐标为(x,y),求距离最近的两个点的坐标和距离 解决方法 考虑两种方法。第一种方法,是暴力解法,简单易懂,但时间复杂度高,当点的数量多时,运行困难。第二种方法,利用分治的思想递归地解决最近点对问题。 暴力法 float baoli(Point points[], int length, Point &amp;amp;a, Point &amp;amp;b){ flo...

qq_42606750的博客 6401

基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验

本文详细介绍了基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验。通过分析纯滞后系统的控制难题,探讨大林算法在工业控制中的应用优势,并提供Matlab-Simulink环境搭建、控制器D(z)设计、振铃消除及仿真实验的完整流程。文章还对比了大林算法与PID控制的性能差异,为工程实践提供参考。

dropout6artist的博客 796

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

一、实验目的: (1)掌握分治法思想。 (2)学会最近点对问题求解方法。 二、内容: 对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,输出是N点中具有最短距离的两点。 要求随机生成N个点的平面坐标,应用蛮力法编程计算出所有点对的最短距离。 要求随机生成N个点的平面坐标,应用分治法编程计算出所有点对的最短距离。 分别对N=100000—1000000,统计算法运行时间,比较理论效率与实测效率的差异,同时对蛮力法和分治法的算法效率进行分析和比较。 如果能将算法执行过程利用图形界面输出

Alex_SCY的博客 6903

树莓派国内镜像源一键配置指南

本文提供树莓派国内镜像源一键配置指南,解决默认国外源访问缓慢问题。通过自动检测系统版本并支持清华、阿里云、中科大等主流镜像站选择,大幅提升软件更新与安装速度。包含详细的手动配置方法和常见问题排查,帮助用户快速完成树莓派换源优化。

tequila的博客 1376

conda upgrade出现Solving environment:failed CondaValueError Malformed version string invalid chars解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对使用conda的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二

weixin_43178406的博客 8万+
上一篇: 汉若塔游戏非递归解法(c#)
下一篇: 生成格雷码序列算法(C++)
qw_study
博客等级 码龄20年 52粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值