引子
近邻搜索是一种很基础的又相当重要的操作,除了信息检索以外,还被广泛用于计算机视觉、机器学习等领域,如何快速有效的做近邻查询一直是一项热门的研究。较早提出的方法多基于空间划分(Space Partition),最具有代表性的如kd-tree(kdt),球树等。本篇将介绍基于空间划分方法中的一种,制高点树(Vantage Point Tree,vpt),最初在1993年提出,比kdt稍晚,提供了一个不一样的建树思路。
VPT结构
和kdt一样,vpt也是一类二叉树,不同的是在每个节点的划分策略。略微回顾一下kdt,它在每个节点选择一个维度,根据数据点在该维度上的大小将数据均分为二。而在vpt中,首先从节点中选择一个数据点(可随机选)作为制高点(vp),然后算出其它点到vp的距离大小,最后根据该距离大小将数据点均分为二。建树算法如下:
- 选择某数据点v作为vp
- 计算其它点{Xi}到v的距离{Di}
- 求出{Di}中值M,小于M的数据点分给左子树,大于M的数据点分给右子树
- 递归地建立左子树和右子树
VPT查询算法
vpt查询是 准确近邻查询,较适合范围查询,可方便扩展为k近邻查询。
进行近邻查询时,假定查询点为q