初学kd树

一开始不会kd树的时候,感觉kd树一定很神,学了kd树发现kd树挺好写。

kd树的每个节点有一个分割超平面,我是以深度%维数作为当前这一维的分割,比较时对于当前节点就比较这一维。

附上模板代码,求平面第k近距离(kd树裸题)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cmath>
 7 using namespace std;
 8 #define maxn 100020
 9 #define inf 0x3f3f3f3f3f3f3fll
10
11 int now;
12 typedef long long ll;
13 struct point{
14     int x[2];
15     bool operator < (point a)const{
16         return x[now] < a.x[now];
17     }
18 }a[maxn];
19 priority_queue <ll> heap;
20 int n,k,id;
21 ll curd;
22
23 void build(int l,int r,int dep){
24     if ( l > r ) return;
25     now = dep % 2;
26     int mid = (l + r) >> 1;
27     nth_element(a + l,a + mid,a + r + 1);
28     build(l,mid - 1,dep + 1);
29     build(mid + 1,r,dep + 1);
30 }
31 inline ll sqr(int x){ return (ll)x * x; }
32 inline ll dis(int x1,int x2,int y1,int    y2){
33     return sqr(x1 - x2) + sqr(y1 - y2);
34 }
35 void query(point p,int l,int r,int dep){
36     if ( l > r ) return;
37     now = dep % 2;
38     int mid = (l + r) >> 1;
39     ll tmp = dis(p.x[0],a[mid].x[0],p.x[1],a[mid].x[1]);
40     if ( mid > id ){
41         if ( heap.size() < k ) heap.push(tmp);
42         else if ( heap.top() > tmp ){ heap.pop(); heap.push(tmp);}
43     }
44     if ( l == r ) return;
45     if ( p.x[now] > a[mid].x[now] ){
46            query(p,mid + 1,r,dep + 1);
47         now = dep % 2;
48         if ( heap.size() < k || heap.top() >= sqr(p.x[now] - a[mid].x[now]) ) query(p,l,mid - 1,dep + 1);
49     }
50     else{
51         query(p,l,mid - 1,dep + 1);
52         now = dep % 2;
53         if ( heap.size() < k || heap.top() >= sqr(p.x[now] - a[mid].x[now]) ) query(p,mid + 1,r,dep + 1);
54     }
55 }
56 int main(){
57     freopen("star.in","r",stdin);
58     freopen("star.out","w",stdout);
59     scanf("%d %d",&n,&k);
60     for (int i = 1 ; i <= n ; i++){
61         scanf("%d %d",&a[i].x[0],&a[i].x[1]);
62     }
63     build(1,n,1);
64     for (int i = 1 ; i <= n ; i++){
65         id = i;
66         query(a[i],1,n,1);
67     }
68     printf("%lld\n",heap.top());
69     return 0;
70 }

以后多学习kd树的应用,kd树模型可以应用的题的类型。

时间: 2024-08-24 22:14:24

初学kd树的相关文章

2016 ICPC青岛站---k题 Finding Hotels(K-D树)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5992 Problem Description There are N hotels all over the world. Each hotel has a location and a price. M guests want to find a hotel with an acceptable price and a minimum distance from their locations.

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

继上一篇中已经介绍了SIFT原理点击打开链接,最后得到了一系列特征点,每个特征点对应一个128维向量.假如现在有两副图片都已经提取到特征点,现在要做的就是匹配上相似的特征点. 相似性查询有两种基本方式:1.范围查询:即给点查询点和查询阈值,从数据集中找出所有与查询点距离小于阈值的点. 2.K近邻查询:给点查询点及正整数K,从数据集中找到与查询点最近的K个数据,当K=1时,就是最近邻查询. 特征匹配算子可以分为两类:1.穷举法:即将数据集中的点与查询点逐一计算距离,如果图1提取到N1个特征点,图2

hdu 4347 The Closest M Points (kd树)

hdu 4347 题意: 求k维空间中离所给点最近的m个点,并按顺序输出  . 解法: kd树模板题 . 不懂kd树的可以先看看这个 . 不多说,上代码 . 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <cstring> 6 #include <queue> 7 #include <s

数据结构(KD树):HDU 4347 The Closest M Points

The Closest M Points Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others)Total Submission(s): 3285    Accepted Submission(s): 1201 Problem Description The course of Software Design and Development Practice is objection

KD树

什么是KD树 Kd-树是K-dimension tree的缩写,是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x,y,z..))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索).本质上说,Kd-树就是一种平衡二叉树. 首先必须搞清楚的是,k-d树是一种空间划分树,说白了,就是把整个空间划分为特定的几个部分,然后在特定空间的部分内进行相关搜索操作.想像一个三维空间,kd树按照一定的划分规则把这个三维空间划分了多个空间,如下图所示: KD树的构建

K-D树问题 HDU 4347

K-D树可以看看这个博客写的真心不错!这里存个版 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 HDU 4349 #include <map> //KD树学习http://blog.csdn.net/zhjchengfeng5/article/details/7855241 #include <set> #include <list> #include <cmath> #include

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

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

KNN算法与Kd树

最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知样本的类别,以全部训练样本作为代表点,计算未知样本与所有训练样本的距离,并以最近邻者的类别作为决策未知样本类别的唯一依据.但是,最近邻算法明显是存在缺陷的,比如下面的例子:有一个未知形状(图中绿色的圆点),如何判断它是什么形状? 显然,最近邻算法的缺陷--对噪声数据过于敏感,为了解决这个问题,我们可

PCL点云库:Kd树

Kd树按空间划分生成叶子节点,各个叶子节点里存放点数据,其可以按半径搜索或邻区搜索.PCL中的Kd tree的基础数据结构使用了FLANN以便可以快速的进行邻区搜索.FLANN is a library for performing fast approximate nearest neighbor searches in high dimensional spaces.下面是一个最基本的例子,只寻找一个最近点: #include <pcl/point_cloud.h> #include &l