zoukankan      html  css  js  c++  java
  • 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可以快速地移除不满足搜索条件的搜索空间。

  • 相关阅读:
    解决 iOS View Controller Push/Pop 时的黑影
    AFN发送请求失败
    cocoapods安装失败
    cocoapods 更新失败 bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
    iOS开发: 向右滑动手势功能实现
    虚拟器运行iOS8地图提示错误
    unexpected nil window in _UIApplicationHandleEventFromQueueEvent...
    控制控制器只支持横/竖屏
    UIWebView执行JS语句
    Warning: Attempt to present * on * which is already presenting *
  • 原文地址:https://www.cnblogs.com/yibeimingyue/p/9858432.html
Copyright © 2011-2022 走看看