Vor-Tree详解

来源:互联网 发布:mysql数据库的面试题 编辑:程序博客网 时间:2024/05/05 14:27


平哥教你学知识系列第1弹:

Vor-Tree详解

预备知识:

    1.R-Tree:R树是一颗以矩形区域为叶子节点的平衡树,其矩形区域为空间数据点的最小外接矩形(MBR)。深入学习R树可以看v_JULY_v的博客:从B树、B+树、B*树谈到R树。链接如下:

http://blog.csdn.net/v_JULY_v/article/details/6530142/
    2.Voronoi diagram泰森多边形:多边形的一条边由相邻两数据点的垂直平分线构成,由次可以推出一条重要的性质----当一查询点位于此多边形内部时查询点距离此多边形对应的数据点最近。如下图,查询点Q1距离数据点V9最近,Q2距离V13、V9、V8距离最近且相等。

Vor-Tree数据结构:

     Vor-Tree的数据结构和R树大致相同,只是在叶子节点做了一些拓展。如下图:



左图为数据点经过泰森多边形和最小外接矩形操作后的状态图。其中不可再分的矩形为叶子节点即N1、N2、N3、N4、N5。右图为Vor-Tree的数据结构,其叶子节点之上部分与R树相同。与R树不同的是Vor-Tree在叶子节点上链接了泰森多边形的信息。其中VN(x)存储与数据点x相邻的泰森多边形(与多边形对应的数据点)VN的作用是为了求KNN(K近邻)。而V(x)存储点x对应的泰森多边形的边的信息,V的最用则是为了求最近邻,存储边的信息是为了判断查询点是否在多边形内部,若数据点在此多边形内则查询点的最近邻为此多边形对应的数据点。



Vor-Tree的查询(1NN-----最近邻):

    相信一些小朋友已经发现了一个问题,如上图(左)所示最小外接矩形(Vor-Tree的节点)并非充满整个查询空间,如果出现一个查询点其位置处于矩形区域的空隙中(如上左图[5,5]点)怎么查询?来我们来看图说话。


    我们先来学习一个概念:MinDist。顾名思义MinDist就是最小距离。此最短距离表示的是如果查询点q在矩形区域外,q距离矩形区域的最小距离。上图中MinDist如虚线所示。当查询点q(x,y)小于等于矩形的Max(x,y)且大于等于其Min(x,y)时MinDist即为q到矩形边的距离(垂线)。当不满足此条件时MinDist则为q到矩形四个顶点距离的最小值
    有了MinDist的概念我们就可以解决查询的问题了。当查询点位于矩形间隙时则计算Vor-Tree当前层所有节点到查询点的MinDist并从小到大排序,取Mindist最小的节点进入。因为MinDist最小的矩形包含最近邻的概率最大。在进入此节点后任然按上述方法向下查找,当到达叶子节点时遍历此叶子节点所包含的所有数据点。取出当前查询的数据点链接的泰森多边形的边(即上图V(x)),判断查询点是否被包含。若所有数据点遍历完毕后仍未找到最近邻,则回溯到MinDist第二小的节点继续向下查找,直到找到最近邻为止。




Vor-Tree的查询(KNN----K近邻):

    Vor-Tree在查找K近邻是首先按照上节方法找到最近邻,找到最近邻后查找最近邻点所链接的VN(x)即相邻的泰森多边形(对应的数据点)。遍历VN(x)的点并计算查询点与他们的距离,最后返回距离最短的K个点。若VN(x)中点的个数小于K时则查找最近邻的第二层临近点即VN(VN(x))在按上述方法计算最后找出K近邻。



最后:

    在实现此算法后对比发现确实比顺序查找要快了很多,但比作者声称得O(logn)的时间复杂度还有一些差距。之后想了想可能是由于测试数据集所生成的矩形有大量的重叠,造成了排序和包含关系的计算量较大。由于需要对Vor-Tree对比效率所以需要学习这个心塞的算法,刚开始竟然发现只有对R树的中文介绍,关于Vor-Tree竟然全是英文的,简直要气炸了。因为英语水平有限对论文的理解难免有错误,还望各位读者不吝赐教。



(全文终)


参考资料:

1.VoR-Tree: R-trees with Voronoi Diagrams for Efficient Processing of Spatial Nearest Neighbor Queries ∗

2.从B树、B+树、B*树谈到R树     http://blog.csdn.net/v_JULY_v/article/details/6530142/



转载请标明出处,原文地址:http://blog.csdn.net/baidu_14831657/article/details/52265990


0 0
原创粉丝点击