最近点对问题算法

最近点对问题是一种很典型的递归分治算法,我们知道,递归分治的核心步骤就是



这里我们怎么分,怎么治,怎么合,便是一个值得探讨的问题。
先给出应用的结构体和主函数:

struct node{double x;double y;
}X[100001],tmp[100001];
int main()
{int N,i;scanf("%d",&N);for(i = 0; i < N; i++){double x,y;scanf("%lf%lf",&x,&y);X[i].x = x;X[i].y = y;}qsort(X,N,sizeof(X[0]),comp_x);//先将点对按x的大小排序double ans = closest(0,N-1);printf("输入点对中距离最近的两点距离为%.2f",ans);
}

本算法的核心在于closest函数,通过这个函数的递归分治,可以大事化小,小事化更小。

double closest(int l, int r)
{if(l + 1 == r)return distance(X[l],X[r]);if(l + 2 == r)return min(distance(X[l],X[l+1]),min(distance(X[l+1],X[r]),distance(X[l],X[r])));//只要输入点对大于2,就“分”:int mid = (l + r) / 2;double left_d = closest(l,mid);double right_d = closest(mid + 1,r);d = min(left_d,right_d);//从这一步开始“合”://具体的合的过程即是把中间处的最小距离和左右求得的最小距离相比较int i,j,a = 0;for(i = l; i <= r; i++){if(fabs(X[i].x - X[mid].x) < d)//把符合初步条件(横坐标与中位线距离小于d的点挖出来,存储在tmp结构体中){tmp[a].x = X[i].x;tmp[a++].x = X[i].y;}}qsort(tmp,a,sizeof(tmp[0]),comp_y);//按照y的大小对tmp结构进行排序for(i = 0; i < a; i++){for(j = i + 1; j < a; j++)//这里之所以敢用两层循环,是因为循环中的break,根据“鸽巢原理/抽屉原理”,一次我们最多找8个点就会break掉了,所以敢放心地用嵌套两层循环{if(tmp[j].y - tmp[i].y >= d)break;d = min(d,distance(tmp[i],tmp[j]));}}return d;
}

具体的原理就是分治合,分治原理的算法就是要弄清楚这样的分治合过程。
---------------------------------------分割线----------------------------------------------
最后补充一下两个快排的comp函数:

int comp_x(const void *a, const void *b)
{return (* (node *)a).x > (* (node *)b).x;
}
int comp_y(const void *a, const void *b)
{return (* (node *)a).y > (* (node *)b).y;
}

【套圈问题】最近点对问题的探讨相关推荐

  1. 【计算理论与算法分析设计】 4. 套圈 (HDU-1007)

    套圈 Description Have you ever played quoit in a playground? Quoit is a game in which flat rings are p ...

  2. 力扣 LCP 42. 玩具套圈 (数学公式反推)

    题意 场地外,小力组织了一个套玩具的游戏.所有的玩具摆在平地上,toys[i] 以 [xi,yi,ri] 的形式记录了第 i 个玩具的坐标 (xi,yi) 和半径 ri.小扣试玩了一下,他扔了若干个半 ...

  3. 《套圈模拟器》用户隐私政策

    您在使用本公司的服务和产品<套圈模拟器>时,本公司可能会收集和使用您的相关信息.希望通过本<隐私政策>向您说明. 重要:TalkingData分析服务 TalkingData为 ...

  4. 中国耐火套圈市场趋势报告、技术动态创新及市场预测

    出版商:贝哲斯咨询 获取报告样本: 企业竞争态势 该报告涉及的主要国际市场参与者有Nelson Fastener Systems.Agrotek Services.Anco International ...

  5. 力扣杯2021秋季编程大赛第四题 LCP 42. 玩具套圈

    原题链接:LCP 42. 玩具套圈 思路 记toy的坐标xt, yt, 半径t ring的坐标xr, yr 满足条件的toy (xt - xr)^2 + (yt - yr)^2 <= (t - ...

  6. UVA10054-The Necklace(无向图欧拉回路——套圈算法)

    Problem UVA10054-The Necklace Time Limit: 3000 mSec Problem Description Input The input contains T t ...

  7. UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)

    题目链接:http://uoj.ac/problem/117 题目大意: 解题思路:先判断度数: 若G为有向图,欧拉回路的点的出度等于入度. 若G为无向图,欧拉回路的点的度数位偶数. 然后判断连通性, ...

  8. leetcode - LCP 42. 玩具套圈 -二分 -坐标映射 -区间查找 - 坐标范围快速查找

    文章目录 解法1 - 给定圈,找套中的玩具 - 超时 解法 2 - 给定玩具找能套中它的圈 - 超时 解法 3 解法2的基础上加入 二分查找区间 - 通过 解法4 - 解法2的基础上 映射x的同时映射 ...

  9. 分治法解决最小套圈问题

    /*     Copyright    by ZhongMing-Bian     Jan,6,2010   */ /*             分治法解决最小套圈问题                 ...

最新文章

  1. 盘点《头号玩家》里的 VR 技术,现在就能造个 Oasis 出来
  2. 设置google浏览器不缓存JS
  3. C#操作SqlServer数据库的常用对象,及其方法
  4. java打jar包,引用其他.jar文件
  5. centos 安装 redmine 2.6.0.stable
  6. MongoDB配置参数说明
  7. Spring Boot 2.0.0.M3使用案例,案例配置,常用命令,注解介绍,热部署
  8. 在Spring中使用Redis
  9. mysql sqlexception_c-很奇怪-mysql的sql :: SQLException未被其类型捕...
  10. 解决 transaction-manager Attribute transaction-manager is not allowed here
  11. 用Veritas制作MSI文件,Active Directory系列之二十四
  12. 求求你,下次面试别再问我什么是 Spring AOP 和代理了!
  13. CCF201712-2 游戏(100分)【模拟】
  14. 谈谈Pod在微服务中的运用
  15. 拉普拉斯(逆)变换的计算
  16. C语言练习题 日期天数转换
  17. 大数据高冷?10个有趣的大数据经典案例
  18. 微服务究竟是“灵丹”还是“毒药”?
  19. WPS 从今以后我再也不会用了 记录一下!
  20. 虚拟机包 OVF和OVA的区别

热门文章

  1. 关于python语言下列说法错误的是_在Python中下列说法错误的是()
  2. 杭电1201--18岁生日
  3. python画玫瑰花和爱心
  4. QT QSlider样式 美化
  5. java.lang.NoClassDefFoundError: org/dom4j/DocumentHelper dom报错
  6. Android开机时长优化
  7. 杏子语录(2020年10月)
  8. 易观招聘 | 遇见offer之就要圆你的大厂梦
  9. 线程池介绍及创建线程池的4种方式
  10. 关于一些初级ACM竞赛题目的分析和题解(六)。