其他分享
首页 > 其他分享> > K-D Tree

K-D Tree

作者:互联网

\(K-D\) \(Tree\)

简述

\(K-D\) \(Tree\)是一种以二叉搜索树为结构,可以高效处理\(k\)维空间信息的数据结构,在处理\(k\)维数点问题上,最差情况下复杂度是\(θ(n \times n^{1 − \frac{1}{k}})\)

拿二维数点为例

\(n\)个二维平面上的点,\(m\)次询问一个二维范围上有多少个点
\((n≤10^{5},m≤10^{5})\)

可以解决问题的算法很多,树套树,\(CDQ\)分治都可以解决,复杂度都是\(θ(mlog^{2}n)\)的

用\(K-D\) \(Tree\)的话,单次询问最优可以达到\(θ(logn)\),最差是\(θ(\sqrt{n})\)的

建树

首先,将\(n\)个二维平面上的点按照顺序排列到二叉搜索树上

为了方便我们的建树,我们会用到一个\(algorithm\)库中的\(nth_element\)的函数,这个函数可以按照\(\frac{x}{y}\)坐标排序,并使第\(k\)小位于选择范围内的第\(k\)个位置上

借用这个函数,我们可以很快求出中位数,在建二叉树时,就能建出一个相对有序的二叉树,对于一个节点,要么他左儿子子树上所有点的\(x\)值都比他小,要么\(y\)值都比他小

除此之外,我们还需\(pushup\)子树内\(x\)值的最大最小值,\(y\)值的最大最小值,便于查询

这样\(K-D\) \(Tree\)就建好了,不一样的题可能\(pushup\)的东西不一样,但\(nth_element\)的操作不变

预估

在二维数点中这个操作是不需要的

在其他问题上经常会用到,如果这个子树的最优可能答案比当前统计的答案还劣,便不会再遍历这个子树,从而更加优化复杂度

预估函数根据不同的题目而随机应变

查询

在二维数点中
如果我们查询的矩形包含了当前查询子树的\(\frac{x}{y}\)最大最小值围成的矩形,那么这颗子树上的点一定全在查询范围内

如果两个矩形没有交集,则这颗子树上的点一定全不在查询范围内

其他情况则直接向下遍历子树

标签:子树,复杂度,数点,Tree,查询,二维
来源: https://www.cnblogs.com/Kamisato-Ayaka/p/16548230.html