84.K-D Tree
K-D Tree
一般的二叉树只能在每个节点上表示一个数据,如果需要在一个节点上表示多个数据,可以用 K-D 树
先假设维度是二维,那么先对
然后再对
第三次对

这种划分的方式叫做轮转法,即有
还有一种划分方式,叫做最大方差法,适用于某些维度的值变化不大的情况,例如二维平面中
建树
如果预先给定了
struct Point{
LL dim[K];
};
Point q[maxn],t[maxn];
int now;
bool cmp(const Point &a,const Point &b){
return a.dim[now] < b.dim[now];
}
void build(int L,int R,int dep){
if(L > R) return ;
int d = dep % K, mid = (L+R)/2; now = d;
nth_element(t+L,t+mid,t+R+1,cmp);
build(L,mid-1,dep+1); build(mid+1,R,dep+1);
}
插入
插入新节点,按照 K-D 树的规则,在 K-D 树上找到需要插入的位置,然后插入
如果发现不平衡,可以利用替罪羊树,推倒重建
删除
同理,也可以使用替罪羊树的删除方法,替罪羊树可以看成是一维的 K-D 树,K-D 树是替罪羊树的拓展