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