详解Kd树之查找
来源:互联网 发布:three.js物体平移 编辑:程序博客网 时间:2024/06/05 16:50
kd树已经构造好,如何查找kd树,接着上篇博文
void searchPathFinding(double []target,SNode<int []> kd_point){
//TODO 发现路径
Stack<SNode<int []>> pathStack = new Stack<SNode<int []>>();
while(kd_point!=null){
pathStack.push(kd_point);
System.out.println(kd_point.data[0]+" "+kd_point.data[1]);
int split = kd_point.split;
if(target[split] <= kd_point.data[split]){
kd_point = kd_point.lc;
}else{
kd_point = kd_point.rc;
}
}
while(!pathStack.end()){
findSimilarPoint(target, pathStack);
}
}
int[] findSimilarPoint(double[] target,Stack<SNode<int []>> pathStack){
//对路径上的点进行回溯筛选
SNode<int []> nearest = pathStack.pop();
double max_dist = countDistance(nearest.data, target);
while(!pathStack.end()){
SNode<int []> back_point = pathStack.pop();
int split = back_point.split;
if(Math.abs(target[split] - back_point.data[split]) < max_dist){
if(target[split] <= back_point.data[split]){
back_point = back_point.rc;
}else{
back_point = back_point.lc;
}
}
if(countDistance(back_point.data, target) < max_dist){
nearest = back_point;
max_dist = countDistance(back_point.data, target);
}
}
System.out.println("nearest point is: "+ nearest.data[0]+" "+nearest.data[1] +" "+ max_dist);
return null;
}
double countDistance(int[] point,double[] target){
return Math.sqrt(Math.pow((point[0] - target[0]),2)+Math.pow((point[1]-target[1]),2));
}
查找的过程如度娘所描述的
- 从root节点开始,DFS搜索直到叶子节点,同时在stack中顺序存储已经访问的节点。
- 如果搜索到叶子节点,当前的叶子节点被设为最近邻节点。
- 然后通过stack回溯:如果当前点的距离比最近邻点距离近,更新最近邻节点.然后检查以最近距离为半径的圆是否和父节点的超平面相交.如果相交,则必须到父节点的另外一侧,用同样的DFS搜索法,开始检查最近邻节点。如果不相交,则继续往上回溯,而父节点的另一侧子节点都被淘汰,不再考虑的范围中.
- 当搜索回到root节点时,搜索完成,得到最近邻节点。
http://wenku.baidu.com/link?url=biVgsUniKgAI2ZIXtSEfz60EIhnXAvMJFBERtbaNSvt9Se8KixwLghPIqQG3cifg767I_ONRSrdOnLWW9KX3C0KpaPWHt5R1PiDMslmnAzG
http://baike.baidu.com/link?url=kTUf8ZEeC2wJa-aNO4ktmpsefgaUdsMaAxO0fK1LBQHXTXzKniGaKHpWB4Hj1dlReB4aw4AakRsqoRPTHb9gKq
- 详解Kd树之查找
- 详解Kd树之构造
- 数据结构之kd树
- KD树详解及KD树最近邻算法
- KD树详解及KD树最近邻算法
- KD树详解及KD树最近邻算法
- KNN之KD树实现
- 使用KD树进行最近邻查找的例子
- k近邻法之kd树
- KD树
- kd树
- KD树
- kd树
- KD树
- KD树
- KD树
- KD树
- kd树
- iOS开发 关于iBeacon
- Bootstrap快速学习笔记(3)网格系统
- copy_to_user()和copy_from_user()实现driver到user和user到driver的数据传送
- 反射
- 自定义UIPickerView
- 详解Kd树之查找
- liunx下oracle的操作日志
- 数组总结
- zookeeper3.4.5自动清理日志
- lex生成lex.yy.c代码流程解析
- 手把手教你用亚马逊云搭建免费VPN服务器
- $q服务的API详解
- 40个Java多线程问题总结
- 高通骁龙MSM8916核心板 ARM Cortex-A53 四核 中文资料