KDTree算法

参考文献

https://blog.csdn.net/xiongjinshui/article/details/8103557

最近临点问题

在空间上给出一个点,求解距离该点最近的点。

  • 首先通过二叉树搜索(比较待查询节点和分裂节点的分裂维的值,小于等于就进入左子树分支,等于就进入右子树分支直到叶子结点),顺着“搜索路径”很快能找到最近邻的近似点,也就是与待查询点处于同一个子空间的叶子结点;
  • 然后再回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索(将其他子结点加入到搜索路径)。
  • 重复这个过程直到搜索路径为空。

需要用到一个队列,存储需要回溯的点,在判断其他子节点空间中是否有可能有距离查询点更近的数据点时,做法是以查询点为圆心,以当前的最近距离为半径画圆,这个圆称为候选超球(candidate hypersphere),如果圆与回溯点的轴相交,则需要将轴另一边的节点都放到回溯队列里面来。

KDTree就是超平面都垂直于轴的BSPTree。bsp树是一种空间分割树,它主要用于游戏中的场景管理,尤其是室内场景的管理。它的本质是二叉树,也就是用一个面把空间分割成两部分,分割出的空间则继续用面分割,以此类推,直到到达特定递归深度,或者空间中不再有物体或只剩下一个物体(得到凸包/凸多面体)。最终,叶结点对应场景中的物体,内部结点存储分割面。物体被"收纳"到各个包围盒中。

二范围查询

假设你有一个用户群。现在要求找出所有34岁到~49岁之间且收入在10W~50W的人数,你回如何做呢?显然,构造一个2d树可以解决这一问题。

展开阅读全文

没有更多推荐了,返回首页