\(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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。