最邻近值搜索方法

Kdtree

  1. kdtree基本原理
  2. 处理跨界最邻近值的情况
    ps:本小节中的超平面皆为与坐标轴垂直或平行的标准(简单)平面

参考链接:https://www.cnblogs.com/wellp/p/8552774.html
一、Kdtree基本原理
根据数据最稀疏的维度D划分K个分支,并求得SplitValue,以2分支为例,左分支所有数据集在D维度SplitValue,递归求解划分,知道满足分支数据集为定义的最小数据集。
二、跨界临近值查找方法
实例:最邻近值搜索方法_第1张图片最邻近值搜索方法_第2张图片

如何判断当圆的半径跨了哪些边界?判断后,依次搜索其子空间数据集查找有可能更为接近目标点的“最邻近点”。

- 二维划分空间
向上回溯,求圆与超平面(SplitDimenson,一维),即圆与直线的交点,有几种情况
1. 交点有一个,与圆相切,未跨界,无操作
2. 交点0个,与圆相离,未跨界,无操作
3. 交点有两个,与圆相交,跨界,需搜索以该直线为超平面划分的另外未被搜索的分支数据集

实际上求:中心点到线的最短距离

- 三维划分空间
向上回溯,求球与平面(SplitDimenson,二维)的交点
球与平面相交的充分必要条件是球心到平面的距离小于球半径,则平面与球面相交。
1. 同二维
2. 同二维
3. 同二维

实际上求:中心点到面(与坐标轴平面面垂直或平行的面)的最短距离

- 求交后方法
本例中超平面皆为与坐标轴垂直或平行的标准(简单)平面,因此可以简单的直接求RefPoint在分割维度上的值与划分值的差值作为“最短距离”。(忽略备注,不是该函数的备注。)
最邻近值搜索方法_第3张图片

- 求交后反向搜索另外的数据集的方法
1. 在第一次搜索到叶节点(最小数据集)的过程中用堆SearchRecords记录中间节点的访问记录,本步获得一个初始的邻近结果
2. 根据堆记录SearchRecords,依次取出节点指针(包含划分维度和划分值)与参考点进行求交计算(距离)d
3. 若相交,则搜索未被搜索的该中间节点的另一分支。这里需要提到点的是,如果使用递归的方法,并在维度上进行比较,最终查找叶节点指针;与此同时并未对记录访问节点的左右分支标志;在复用该方法函数的情况下,可以设计一个临时用于搜索的tempRefPoint,使得以tempRefPoint恰好可以搜索RefPoint的反向分支,搜索到另外的叶节点(另外的最小数据集)。
4. tempRefPoint = RefPoint 在分割维度的值 > 划分值? RefPoint在该分割维度 - R : RefPoint在该分割维度+R;
5. 搜索到另外的数据集后,求得与RefPoint最近的一个结果
6. 当搜索完毕,选择最小邻近结果
7. 结束
部分代码实例:最邻近值搜索方法_第4张图片

你可能感兴趣的:(最邻近值查找,算法)