算法5-6:Kd树

问题

给定一系列的点,和一个矩形。求矩形中包含的点的数量。

解答

这个问题可以通过建立矩阵来进行求解。首先将一个空间分割成矩阵,将点放置在对应的格子中,再计算矩形覆盖的格子,再判断格子中的点是否包含在矩形中

这种方法的问题是,可能这些点全都集中在一个格子中。这种情况下算法的效率比较低。

这种问题在地图的应用中非常常见。

因此需要引入2D树的概念,使得矩阵的分解会根据点的密度自动适应。

2D树

下图展示了2D树的样子。

2D树的构建

每次加入一个点时,将平面分成两半。

加入第二个点时,由于第二个点在第一个点的右侧,因此在第一个点的右子节点创建一个新的节点。由于父节点是竖直的,所以子节点需要水平分割。

增加更多的点之后,就会形成如下的二叉树。

搜索操作

搜索矩形中包含的点。

搜索的时候需要从根节点开始。从根节点知道,矩形在节点的左侧,因此只需要搜索左侧即可。到了点3,由于矩形覆盖了两边的区域,因此需要搜索两边。一直迭代循环,直到节点搜索完毕为止。

这种算法的平均复杂度是logN,最坏复杂度是sqrtN。

问题

给定一系列点,和一个待测点。求与待测点最近的点。

用2D树的数据结构时,有时可以将搜索范围缩小到一半。

Kd树就是2D树的推广形式,处理二维以上的数据时非常高效。

N体模拟算法

关键思想就是对于单个质点来说,将距离较远的那些点看成一个质点。

具体实现可以参考论文

http://www.cs.montana.edu/courses/spring2005/580/papers/0906008.pdf

算法5-6:Kd树

时间: 2025-01-06 00:05:58

算法5-6:Kd树的相关文章

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

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

KNN算法与Kd树

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

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树按照一定的划分规则把这个三维空间划分了多个空间,如下图所示:

kd树的构建以及搜索

构建算法 k-d树是一个二叉树,每个节点表示一个空间范围.表1给出的是k-d树每个节点中主要包含的数据结构. 表1 k-d树中每个节点的数据类型 域名 数据类型 描述 Node-data 数据矢量 数据集中某个数据点,是n维矢量(这里也就是k维) Range 空间矢量 该节点所代表的空间范围 split 整数 垂直于分割超平面的方向轴序号 Left k-d树 由位于该节点分割超平面左子空间内所有数据点所构成的k-d树 Right k-d树 由位于该节点分割超平面右子空间内所有数据点所构成的k-d

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

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

OpenCV K-d树实现之FLANN (Fast Library for Approximate Nearest Neighbors) 算法实现及解析

k-d树搜索最近点,在opencv中使用FLANN算法,其包含: 1:建树   2.查询 程序见下: #include "kdtree.h" #include <iostream> #include <iomanip> #include "cv.h" #include "highgui.h" #include <fstream> #include "cv.h" #include "

K-d 树对聚类算法进行预处理

在用聚类算法如k-means对数据进行聚类处理的时候,按照一般的处理方法,需要将每个数据跟其他所有的元素进行比较,计算相似度,然后才能聚类. 假定有N个元素,则需计算N*(N-1)/2 次,当N非常大的时候,则非常消耗时间,这种时候,可以使用K-d树数据结构,对所有数据进行重新组织,构成一棵而叉树. k-d树的构建,最典型的方法如下: 随着树的深度轮流选择轴当作分区面.(例如:在三维空间中根节点是 x 轴垂直分区面,其子节点皆为 y 轴垂直分区面,其孙节点皆为 z 轴垂直分区面,其曾孙节点则皆为

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.