算法(1):KD树的原理与基本代码

目录

前言

一、什么是KD树

二、为什么要用KD树

三、KD树的基本思路

四、KD树的几种情况分析

4.1 另一子空间不存在更近的点

4.2 另一子空间存在更近的点

4.3 小结

五、KD树的代码(二维点,python版本)

六、KD树的代码(多维版本)

6.1 python版本

七、KD树的应用

7.1 找目标平面或者空间中离目标点的最近点

7.2 找目标平面或者空间中离目标点的若干个最近点

八、参考资料


前言

由于在做项目时遇到平面内最近点求解的问题,需要用到KD树简化算法,减少计算资源,因此本文记录这个过程中学到的知识。

一、什么是KD树

kd-tree(k-dimensional树的简称),kd树就是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,可以运用在k近邻法中,实现快速k近邻搜索。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分。k-d树是每个节点都为k维点二叉树。所有非叶子节点可以视作用超平面把空间分割成两半空间。节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。

二、为什么要用KD树

主要是为了快速计算,节省计算资源。如前言中提到的例子,计算平面中一堆点中哪一个和目标点最近的问题,如果使用常规方法需要计算所有点与目标点的距离,然后进行比较,这样在平面中点非常多的时候非常浪费计算资源,速度也很慢。为了解决这个问题,可以在这个过程中引入KD树进行算法上的简化。

三、KD树的基本思路

下面是一个学习KD树的经典案例:

在二维平面上有以下六个点:(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)

KD树的目的要确定图1中这些分割空间的分割线,确定步骤如下:

(1)第一步,将上述六个点的点集按照二维平面的第一维(x轴)对数据进行排序,排序结果为(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)

(2) 第二步,取得上述点集的中位数处的点,偶数个数的中位数一般取大的那个,在上述点集中取到的为(7,2),在该点处对平面进行划分,如图1中(7,2)位置画上一条竖线

(3)第三步,将由(7,2)划分的左右两平面中的剩余点按照二维平面的第二维(y轴)对数据排序,排序结果为左枝:(2,3),(5,4),(4,7)和右枝(8,1),(9,6)

(4)第四步,将左枝和右枝分别取中位数点作为新的节点,按照第一维继续排序,直致每一个子枝上只剩一个点,这个点被称作叶子。

上述过程画成图如下:

需要注意的是,每次划分之后排序的逻辑是按照纬度一次类推的,在二维平面中就是按x,y,x,y,x,y....轴排序,如果在三维空间中就是x,y,z,x,y,z,x,y,z....轴排序。

进行完上述操作后就将数据划分完毕,可以将目标点放到该KD树中比较了。

四、KD树的几种情况分析

4.1 另一子空间不存在更近的点

案例如下:

初始点集仍为(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)六个点

目标点为(2.1,3.1)

依据上述KD树的搜索逻辑,操作如下:

(1)将初始点击根据第一维(X坐标)排序为(2,3)(4,7)(5,4)(7,2)(8,1)(9,6),其中位数取4,也就是(7,2)点,在上图中 X=7 处画上分割线

(2)判断目标点的X坐标2.1小于(7,2),因此取划分后的左侧空间中的点(2&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值