zoukankan      html  css  js  c++  java
  • kd-tree 小结

    核心思想

    是一种分割 (k) 维数据空间的数据结构
    一维情况下就是平衡树,以 (key) 为标准判断插入左儿子还是右儿子

    (kdtree) 就是平衡树在多维空间的扩展
    因为有多维,我们按不同维度交错作为关键字进行插入与查询
    如:第一层按照第一维排序,第二层按照第二维排序,第 (k) 层按照第 (k) 维排序
    每一层取该维的中位数,把空间中的点分割开来,分别作为当前点的左右儿子,直到该层只有一个点停止

    实现与运用

    (OI) 中,运用最多的是二维的情况,一般当作优秀的暴力来用
    如查询离某个点最远/近的点,插入一个点........

    首先可以定义一个类,方便每一层排序和分割使用,定义一个重载运算符 ([x]) 就可以方便的以第 (x) 维排序了

    struct data{
    	int a[K],mn[K],mx[K],l,r;
    	inline int& operator [](int x){return a[x];}
    }t[N];
    inline bool operator <(data p,data q){return p[D]<q[D];}
    

    (build) 操作

    inline int build(int l,int r,int k){
    	D=k;
    	int mid=(l+r)>>1,o=mid;
    	nth_element(t+l,t+mid,t+r+1);
    	for(int i=0;i<2;i++)t[o].mn[i]=t[o].mx[i]=t[o][i];
    	if(l<mid)t[o].l=build(l,mid-1,k^1);
    	if(r>mid)t[o].r=build(mid+1,r,k^1);
    	return upd(o),o;
    }
    

    用到了 (STL) (nth\_element), 这个系统函数支持查找第 (k) 大数,并实现分割的效果
    具体来说,(nth\_element(a+1,a+mid,t+r+1)) 后,会把 (a) 数组中第 (mid) 大的数放到第 (mid) 位置,并把小于 (mid) 的放到 (mid) 这个位置之前,大于的放到后面(但左右内部都是无序的),完美的达到了分割的效果

    (query) 操作:

    拿查询离某个点最远的点举例
    我们需要定义一个估价函数:
    例子中也就是不管合法性的情况下,离这个点可能的距离的最大值,把两维分开考虑相加即可
    一半来说是维护一个最小矩形,使得这个节点子树内的节点都可以被包含,查询时与这个矩形有交才往下递归
    一次查询的复杂度期望是 (O(n^{1-1/k}+m)) m---每次要搜索的最近点个数

    inline int cmax(int o){
    	if(!o)return 0;
    	int ret=0;
    	for(int i=0;i<2;i++)
    		ret+=max(abs(t[o].mx[i]-t[I][i]),abs(t[o].mn[i]-t[I][i]));
    	return ret;
    }
    

    求出两个儿子的估价函数之后,先递归较优的一边,判断是否可能比答案更优,不可能优则不递归

    inline void qmax(int o){
    	int dl=cmax(t[o].l),dr=cmax(t[o].r),dc=dis(o);
    	tmax=max(tmax,dc);
    	if(dl>dr){
    		if(dl>tmax)qmax(t[o].l);
    		if(dr>tmax)qmax(t[o].r);
    	}
    	else{
    		if(dr>tmax)qmax(t[o].r);
    		if(dl>tmax)qmax(t[o].l);
    	}
    }
    

    (insert) 操作

    与平衡树类似,判断与当前节点大小关系判断左右走向,可以用定期重构稳定复杂度,数据范围较大时,不重构效果更好

    inline int ins(int o,int k){
    	if(!o)return cnt;
    	if(e[k]>t[o][k])t[o].r=ins(t[o].r,k^1);
    	else t[o].l=ins(t[o].l,k^1);
    	return upd(o),o;
    }
    
  • 相关阅读:
    Variational Autoencoders and Nonlinear ICA: A Unifying Framework
    各层的特征的差异性
    TriggerBN +
    Exponential family of distributions
    个人加分项
    对老师的建议
    2021.6.19
    2021.6.18
    2021.6.17
    2021.6.16
  • 原文地址:https://www.cnblogs.com/Yuzao/p/9041850.html
Copyright © 2011-2022 走看看