kd树(k-dimensional tree)(1)

  kd树(k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。

  索引结构中相似性查询有两种基本的方式:一种是范围查询(range searches),另一种是K近邻查询(K-neighbor searches)。范围查询就是给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据;K近邻查询是给定查询点及正整数K,从数据集中找到距离查询点最近的K个数据,当K=1时,就是最近邻查询(nearest neighbor searches)。

  一般有两类方法:一类是线性扫描法,即将数据集中的点与查询点逐一进行距离比较,也就是穷举,缺点很明显,就是没有利用数据集本身蕴含的任何结构信息,搜索效率较低,第二类是建立数据索引,然后再进行快速匹配。因为实际数据一般都会呈现出簇状的聚类形态,通过设计有效的索引结构可以大大加快检索的速度。索引树属于第二类,其基本思想就是对搜索空间进行层次划分。根据划分的空间是否有混叠可以分为Clipping和Overlapping两种。前者划分空间没有重叠,其代表就是k-d树;后者划分空间相互有交叠,其代表为R树。

  在数据库系统中,我们可能要查询生日在某个范围中并且薪水在某个范围的人数,这可以看做一个二维的查询,kd树就是为多维空间关键数据的快速查询搜索设计的:

  尽管可以创建一个任何维数的kd树,但是一个kd树中存储的数据必须具有同样的维数,比如你不能存储二维空间的数据在三维空间的kd树中。

  Kd树是二叉树,对于n个点,O(n)的空间和O(lgn)的高度(如果平衡的话)

  

  创建一个二维的kd树(2d树):

  At each step, choose one of the coordinate as a basis of dividing the rest of the points

  ? For example, at the root, choose x as the basis

   – Like binary search trees, all items to the left of root will have the x-coordinate less than that of the root

   – All items to the right of the root will have the x-coordinate greater than (or equal to) that of the root

  ? Choose y as the basis for discrimination for the root’s children

  ? And choose x again for the root’s grandchildren

  其实就是通过x,y对空间不断分割,其实二叉搜索树也是这样的,只不过它是一维的而已。

const int DIMEN = 2;
kdNode insert (point p, kdNode t, int dimen) {
  if(t == 0)
    t = new kdNode(p) ;
  else if (p == t.data ) ……
  else if (p[dimen] < t.data[dimen])
    t.left = insert (p, t.left, (dimen+1)%DIMEN );
  else
    t.right =insert (p, t.right, (dimen+1)%DIMEN);
  return t ;
}

? 查找一个指定维数上的最小值,如拥有最小x的值:

Point findmin (kdNodet, int whichAxis, int dimen) {
  if(t == 0)
    return 0;
  else if ( whichAxis == dimen)
  {
    if (t.left == 0) return t.data;
    else
    return findmin (t.left, whichAxis,(dimen+1)%DIMEN );
  }
  else
  return minimum(t.data, findmin(t.left, whichAxis,(dimen+1)%DIMEN),findmin(t.right,whichAxis,(dimen+1)%DIMEN)) ;
}

? 如果树是平衡的, findmin (root): O(sqrt(n)) time in the worst case.

删除节点:

kdNode remove ( kdNode t, Point p, int dimen) {
  if ( t == 0 )
    return 0 ;
  else if ( p[dimen] < t.data[dimen] )
    t.left = remove (t.left, p, (dimen+1)%DIMEN);
  else if( p[dimen] > t.data[dimen] )
    t.right = remove(t.right, p, (dimen+1)%DIMEN);
  else {
    if( t.right == 0 && t.left == 0 )
      return 0 ;
    if( t.right ! = 0 )
      t.data = findmin(t.right, dimen, (dimen+1)%DIMEN);
    else {
      t.data = findmin(t.left, dimen, (dimen+1)%DIMEN);
      t.left = 0 ;
    }
    t.right = remove ( t.right , t.data , (dimen+1)%DIMEN);
    return t ;
  }
}

  删除叶子上的点,如果树是平衡的, remove() takes O(log n) time。

时间: 2025-01-02 15:15:50

kd树(k-dimensional tree)(1)的相关文章

多维空间分割树--KD树

算法介绍 KD树的全称为k-Dimension Tree的简称,是一种分割K维空间的数据结构,主要应用于关键信息的搜索.为什么说是K维的呢,因为这时候的空间不仅仅是2维度的,他可能是3维,4维度的或者是更多.我们举个例子,如果是二维的空间,对于其中的空间进行分割的就是一条条的分割线,比如说下面这个样子. 如果是3维的呢,那么分割的媒介就是一个平面了,下面是3维空间的分割 这就稍稍有点抽象了,如果是3维以上,我们把这样的分割媒介可以统统叫做超平面 .那么KD树算法有什么特别之处呢,还有他与K-NN

k-d树

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

02-17 kd树

目录 kd树 一.kd树学习目标 二.kd树引入 三.kd树详解 3.1 构造kd树 3.1.1 示例 3.2 kd树搜索 3.2.1 示例 四.kd树流程 4.1 输入 4.2 输出 4.3 流程 五.kd树优缺点 5.1 优点 5.2 缺点 六.小结 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ kd树 k近邻算法中讲到它有一个较为致命的缺点就是每个实例到未来新

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

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

k近邻法的C++实现:kd树

1.k近邻算法的思想 给定一个训练集,对于新的输入实例,在训练集中找到与该实例最近的k个实例,这k个实例中的多数属于某个类,就把该输入实例分为这个类. 因为要找到最近的k个实例,所以计算输入实例与训练集中实例之间的距离是关键! k近邻算法最简单的方法是线性扫描,这时要计算输入实例与每一个训练实例的距离,当训练集很大时,非常耗时,这种方法不可行,为了提高k近邻的搜索效率,常常考虑使用特殊的存储结构存储训练数据,以减少计算距离的次数,具体方法很多,这里介绍实现经典的kd树方法. 2.构造kd树 kd

kd树 求k近邻 python 代码

  之前两篇随笔介绍了kd树的原理,并用python实现了kd树的构建和搜索,具体可以参考 kd树的原理 python kd树 搜索 代码 kd树常与knn算法联系在一起,knn算法通常要搜索k近邻,而不仅仅是最近邻,下面的代码将利用kd树搜索目标点的k个近邻. 首先还是创建一个类,用于保存结点的值,左右子树,以及用于划分左右子树的切分轴 class decisionnode: def __init__(self,value=None,col=None,rb=None,lb=None): sel

k近邻与kd树

k近邻是一种特别简单的有监督学习算法.给定一个带标签的训练数据集,从中选择与预测样本最近的k个训练样本,用这k个样本投票决定预测样本标签. k近邻法三要素:距离度量,k值选择和分类决策规则 为了提高k近邻搜索效率,比较常用的就是线性扫描和kd树(二叉树) kd树构造:对每个维度的特征依次寻找中位数划分子集,并以此中位数作为节点 代码: pass kd树搜索代码: 主要就是舍弃当前兄弟节点与当前圆没有相交的分支,减少搜索量(这里判断交集的时候,只需要依据父节点划分所依据的那一维度的值即可) 代码

K 近邻算法(KNN)与KD 树实现

KD树节点 /// <summary> /// KD树节点 /// /2016/4/1安晟添加 /// </summary> [Serializable] public class KDTreeNode { /// <summary> /// 获取或设置节点的空间坐标 /// </summary> public double[] Position { get; set; } /// <summary> /// 获取或设置分裂维度的索引 /// G

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.