c#通过KD树进行距离最近点的查找的案例

  介绍

小编给大家分享一下c#通过KD树进行距离最近点的查找的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

<强> 1。KD树介绍

KD tree (KD树),即k维树,是一种高维索引树形数据结构,常用于在大规模的高维数据空间进行最邻近查找和近似最邻近查找。我实现的KD树是二维的KD -树。目的是在点集中寻找最近点。参考资料是KD tree的百度百科。并且根据百度百科的逻辑组织了代码。

<强> 2。KD树的数学解释

<强> 3。KD树的构造方法

这里是用的二维点集进行构造KD tree。三维的与此类似。
树中每个节点的数据类型:

 KDTreeNode公共类
  {///& lt; summary>///分裂点///& lt;/summary>
  公共点pisionPoint{得到;设置;}///& lt; summary>///分裂类型///& lt;/summary>
  公共EnumpisionType pisionType{得到;设置;}///& lt; summary>//左子节点///& lt;/summary>
  公共KDTreeNode LeftChild{得到;设置;}///& lt; summary>//右子节点///& lt;/summary>
  公共KDTreeNode RightChild{得到;设置;}
  }

3.1 KD树构造逻辑流程

<李>

将所有的点放入集合的中

<李>

对集合所有点的X坐标求得方差十五,Y坐标求得方差青年志愿

<李>

如果十五比;青年志愿,则对集合一根据X坐标进行排序。如果在电视上学到十五,则对集合一根据y坐标进行排序。

<李>

得到排序后一个集合的中位数m。则以米为断点,将[0,m - 2]索引的点放到a1集合中。将[m, a.count]索引的点放到a2的集合中(m点的索引为m - 1)。

<李>

构建节点,节点的值为(m - 1),如果操作集合中节点的个数大于1,则左节点对[0,m - 2]重复2 - 5步,右节点为对[m, a.count]重复2 - 5步;反之,则该节点为叶子节点。

3.2代码实现

 <李> 

对于根据点集构建的树,以及查找点p。将根节点作为节点t进行如下的操作

<李>

如果t为叶子节点。则得到最近点n的值为t的分裂点的值,跳到第5步;如果t不是叶子节点,进行第3步

<李>

则确定t的分裂方式,如果是按照x轴进行分裂,则用p的x值与节点的分裂点的x值进行比较,反之则进行Y坐标的比较

<李>

如果p的比较值小于t的比较值,则将t指定为t的左孩子节点。反之将t指定为t的右孩子节点,执行第2步

<李>

定义检索点米,将米设置为n

<李>

计算m与p的距离d1, n与m的距离d2。

<李>

如果d1祝辞=d2且有父节点,则将m的父节点作为m的值执行5步,若没有父节点,则得到真正的最近点TN;如果d1 & lt;d2就表示n点不是最近点,执行第8步

<李>

若n有兄弟节点,则n=n的兄弟节点;若n没有兄弟节点,则n=n的父节点。删除原来的n节点,将m的值设置为新的n节点;执行第6步。

4.2代码实现

c#通过KD树进行距离最近点的查找的案例