KD树,来源计算几何,在《计算几何-算法与应用》一书中有详细的解释。

  这题是比较裸的KD树模型,要在点集中找到离一个点最近的一个点。其实KD树就是一棵多维平衡二叉树,将多维空间分成很多个部分,查找时能够较快的逼近查找点,从而快速的找到距离某点最近或者较近的点。

  在网上找到了这份模版,简洁高效。

  MARK一下URAL1369,也是一道KD树,目前TLE中。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #define MAXN 100005
 5 #define INF (1LL<<62)
 6 using namespace std;
 7 typedef long long LL;
 8 struct point{
 9     int x,y;
10 }p[MAXN],p2[MAXN];
11 bool dv[MAXN];
12 bool cmpx(const point& p1,const point& p2){
13     return p1.x<p2.x;
14 }
15 bool cmpy(const point& p1,const point& p2){
16     return p1.y<p2.y;
17 }
18 LL getdis(point p1,point p2){
19     return (LL)(p1.x-p2.x)*(p1.x-p2.x)+(LL)(p1.y-p2.y)*(p1.y-p2.y);
20 }
21 void buildKD(int l,int r,point p[]){
22     if(l==r)return;
23     int mid=(l+r)>>1;
24     //按照坐标范围选择建树轴
25     int minx=min_element(p+l,p+r,cmpx)->x;
26     int miny=min_element(p+l,p+r,cmpy)->y;
27     int maxx=max_element(p+l,p+r,cmpx)->x;
28     int maxy=max_element(p+l,p+r,cmpy)->y;
29     dv[mid]=(maxx-minx>=maxy-miny);
30     //dv[mid]=(step&1);也可以按照层数交替建树,貌似效率略慢
31     nth_element(p+l,p+mid,p+r,dv[mid]?cmpx:cmpy);
32     buildKD(l,mid,p);
33     buildKD(mid+1,r,p);
34 }
35 LL res=0;
36 void find(int l,int r,point a,point p[]){
37     if(l==r)return;
38     int mid=(l+r)>>1;
39     LL dist=getdis(a,p[mid]);
40     if(dist>0)res=min(res,dist);
41     LL d=dv[mid]?(a.x-p[mid].x):(a.y-p[mid].y);
42     int l1=l,l2=mid+1,r1=mid,r2=r;
43     if(d>0)swap(l1,l2),swap(r1,r2);
44     find(l1,r1,a,p);
45     if(d*d<res)find(l2,r2,a,p);
46 }
47 int n,cas;
48 int main(){
49     freopen("test.in","r",stdin);
50     scanf("%d",&cas);
51     while(cas--){
52         scanf("%d",&n);
53         for(int i=0;i<n;i++)
54             scanf("%d%d",&p[i].x,&p[i].y),p2[i]=p[i];
55         buildKD(0,n,p);
56         for(int i=0;i<n;i++){
57             res=INF;
58             find(0,n,p2[i],p);
59             printf("%I64d\n",res);
60         }
61
62
63     }
64     return 0;
65 }

  

转载于:https://www.cnblogs.com/swm8023/archive/2012/09/04/2670258.html

HDU 2996 In case of failure [KD树]相关推荐

  1. KD树(k-d tree)

    维基百科介绍: http://en.wikipedia.org/wiki/Kdtree KD树是一种能在 O(N) 时间内把平面划分成若干个区域,然后在均摊 O(logN) 的时间内找到某个区域内所有 ...

  2. 利用SAH实现kD树快速分割模型实践

    前言:简单的数据结构的尝试,主要是为研究RTRT准备,折腾了不少时间.从我C++博客转过来的,希望大伙觉得有些价值. kD 树是二叉树结构的一个变种,当前主要用于加速光纤跟踪的遍历过程.最简单的排序二 ...

  3. 【特征匹配】SIFT原理之KD树+BBF算法解析

    转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/47606159 继上一篇中已经介绍了SIFT原理与C源码剖析,最后得到了一系列特 ...

  4. HDU - 5542 The Battle of Chibi(树状数组+DP)

    UVA - 12983 The Battle of Chibi(树状数组+DP) HDU - 5542 The Battle of Chibi(树状数组+DP) #include<cstdio& ...

  5. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    原文出自:http://blog.csdn.net/v_JULY_v/article/details/8203674 前言 前两日,在微博上说:"到今天为止,我至少亏欠了3篇文章待写:1.K ...

  6. 【转】从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    最近在看<统计学习方法>,发现这么一篇好文章,与大家分享 转自:http://blog.csdn.net/v_july_v/article/details/8203674?reload 前 ...

  7. kd树 python实现_Python KD树实现+简单的KNN实现

    写KD树的时候没把类别考虑进去...所以先用KD算出最近的k个点,然后找到对应分类最后输出占比最大的 KD树是一种二叉树,用来分割空间上得点 一个树节点的结构如下: class TreeNode: i ...

  8. K-近邻算法之kd树

    K-近邻算法之kd树 问题导入: 实现k近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索. 这在特征空间的维数大及训练数据容量大时尤其必要. k近邻法最简单的实现是线性扫描(穷举搜索),即要 ...

  9. KNN分类器、最近邻分类、KD树、KNN分类的最佳K值、基于半径的最近邻分类器、KNN多分类、KNN多标签分类、KNN多输出分类、KNN分类的优缺点

    KNN分类器.最近邻分类.KD树.KNN分类的最佳K值.基于半径的最近邻分类器.KNN多分类.KNN多标签分类.KNN多输出分类.KNN分类的优缺点 目录

最新文章

  1. Zoom重金并购25人安全初创公司,市值一夜大涨23亿美元
  2. Zygote进程启动流程分析
  3. 月薪没过20K的程序员要注意了!(文末送书)
  4. debian 下配置common lisp环境
  5. 性能调优工具类TimeStone
  6. UVA719 Glass Beads 最小表示 / 后缀自动机
  7. 【数论】疯狂 LCM(P1891)
  8. 【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证
  9. 邮箱管理系统 -- 【课程设计】 idea; MVC; mysql;jsp
  10. Oracle P6培训系列:06创建项目日历
  11. 电脑插入耳机未识别的问题
  12. 5-2 jmu-java-m05-自定义Judgeable接口 (10分)
  13. 现代制造业信息化建设的主要内容
  14. ThinkPHP--initialize()方法
  15. 单片机Fault故障常见应对办法
  16. 2016微信数据报告 大数据展示微信生活
  17. doodoo.js快速入门教程 1
  18. 视频网站中video标签中blob:http
  19. 最新100个微信小程序
  20. VS2015许可证过期

热门文章

  1. 《NoSQL权威指南》导读
  2. windows update更新失败 安全模式进不去
  3. (转)java中的 | ^ 分别是什么?
  4. 【足迹C++primer】52、,转换和继承虚函数
  5. hdu 4539(状压dp)
  6. Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)
  7. python中关键字 表示空类型_python中什么表示空类型
  8. nginx-1.13.x源码安装
  9. Linux 添加新用户账号并赋予root权限
  10. Codeforces 924D Contact ATC (看题解)