Scala实现:KD-Tree(k-dimensional tree)

本文介绍了一种在多维空间数据搜索中应用广泛的KD-Tree数据结构,并详细讲解了其构建与最近邻搜索的原理。提供了Scala语言实现的代码示例,包括树节点定义、KD-Tree创建、最近邻查找及K近邻查找算法。

Scala实现:KD-Tree(k-dimensional tree)

kd-tree是一种分割k维数据空间的数据结构。主要应用于多维空间数据的搜索,经常使用在SIFT、KNN等多维数据搜索的场景中,以KNN(K近邻)为例,使用线性搜索的方式效率低下,k-d树本质是对多维空间的划分,其每个节点都为k维点的二叉树kd-tree,因此可以大大提高搜索效率。

KD-Tree的构建步骤:

kd树实现步骤.jpg

上述文字引自李航博士的《统计学习方法》

以{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}数据集为例构建KD-Tree。

KD-Tree空间划分示意图如下:

划分结果.png

kdtree树结构.jpg

关于三维数据的空间划分示意图如下所示

三维kdtree空间划分

更多维度的数据划分只能靠脑补了······

KD-Tree最邻近搜索:
  1. 从根节点开始,递归的往下访问kd树,比较目标点与切分点在当前切分维度的大小,小于则移动到左子结点,大于则移动到右子结点,知道子结点为叶结点为止。

  2. 一旦移动到叶结点,将该结点当作"当前最邻近点"。

  3. 递归回退,对每个经过的叶结点递归地执行下列操作:

    1. 如果当前所在点比"当前最邻近点"更靠近输入点,则将其变为当前最邻近点。
    1. 当前最近点一定存在于该节点一个子结点对应的区域,检查另一子结点对应的区域是否与目标点为球心,以目标点与“当前最邻近点”之间的距离为半径的超球体相交:
    • 1.如果相交,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值