KD-tree

之前看过一个关于kd_tree的形象的解释,现在想重新看下,可惜找不到了,网上很多关于这个解释太教条化,不够简单。在此记录下自己的肤浅的理解。

如图,这个图的建立就不解释了,网上很容易搜到,主要是利用X方向和Y方向数据的方差大小去确定第一次画线是横着画还是竖着画,应该是这样:数据在横向更分散(方差更大)的话第一次画线就竖着画,数据在竖向更分散的话第一次画线就横着画。

现在只说建好图之后的回溯,网上用回溯一词,我感觉没必要说的那么高大上,就是回看。现在需要找到离星号P点距离最近的点,这里可以认为点P是一个新点(newpoint)。

1.从A点开始很容易通过一直比较x坐标和y标的大小找到点E,比如说A点左区域与A点右区域比较的话,A点左区域中的点一定离P点更近(因为XP>XA>XB),找到点E后,没法再往下找了。

2.以P为圆心,以PE的长度为半径画圆,此圆与C点所在的直线若没有交点,那最临近点就是E,针对本例而言,是有交点的,这说明C点所在直线的上面有可能存在离P点更近的点。

3.关注P点上面的点。首先比较PC与PE,发现PC>PE,则更新E点为C点。

4.比较PC与PD的长度(因为离C最近的节点是叶子节点D),结果是C点不被更新,比较PC与PF的长度,结果是不被更新,比较PC与PG的长度,结果是PG<PC,则C点被更新为G点。

5.现在走到G点了,再回看。F,D,C,这三个点都被比较过了,所以不用管它们了。以P为中心,以PG为半径画圆,与A点所在直线没有交点,说明A点右边区域内的点离P点只会比G点离P点更远,而不会更近。

6.G点就是要找的最临近点。

最近邻搜索意在树中搜索得到与给定点最近的点。最近邻搜索可以kdtree树高效地实现,因为kdtree可以快速地移除不满足搜索条件的搜索空间。

原文地址:https://www.cnblogs.com/yibeimingyue/p/9858432.html