在k-d tree树中进行数据的k近邻搜索是特征匹配的重要环节,其目的是检索在k-d tree中与待查询点距离最近的k个数据点。
最近邻搜索是k近邻的特例,也就是1近邻。将1近邻改扩展到k近邻非常容易。下面介绍最简单的k-d tree最近邻搜索算法。
基本的思路很简单:首先通过二叉树搜索(比较待查询节点和分裂节点的分裂维的值,小于等于就进入左子树分支,大于就进入右子树分支直到叶子结点),顺着“搜索路径”很快能找到最近邻的近似点,也就是与待查询点处于同一个子空间的叶子结点;然后再回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索(将其他子结点加入到搜索路径)。重复这个过程直到搜索路径为空。
算法:kdtreeFindNearest
输入:Kd
target
输出 : nearest
dist1. 如果Kd是空的,则设dist为无穷大返回2. 向下搜索直到叶子结点
pSearch= &Kdwhile(pSearch !=NULL)
{
pSearch加入到search_path中;if(target[pSearch->split] <= pSearch->dom_elt[pSearch->split])
{
pSearch= pSearch->left;
}else{
pSearch&