[学习笔记]K-D tree

匆匆过客 提交于 2020-01-17 22:10:41

K-D Tree

先分析一下这个算法的名称:K 是维数,然后D是“Dimension”,维度

显然是一个数据结构

这个数据结构是处理在多维空间内关于“点”的问题

例如“平面内最远点对”,“k”远点对

无论是在几维空间里,都是有坐标轴的

在使用的时候有一种“坐标轴分治”的感觉

维护的信息:

split :分裂坐标轴

ls、rs:左右儿子

node:该节点存储的真实点

 

然后是三个操作:建树,查询,插入

 

建树:

递归建树。类似平衡树

选择当前区域的点的各个维度的方差最大的维度(传说如果方差大,数据分散,复杂度或者精度有所保证??),把这个维度当做split

这个节点的真实点就是c[mid]

然后,把这个维度[s]小于c[mid][s]的放在左边,大于的放在右边。

(实现时,用一个nth_element,再重载小于号,可以O(n)实现把中间的放在mid位置上,并且这个维度[s]小于c[mid][s]的放在左边,大于的放在右边。)

然后递归建树即可。

 

x,y是split

 

这样,整个K-D Tree就把一些点分成了若干个块。

我们一块一块处理会比较容易剪枝。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!