k-d tree背诵用模板

本文介绍了一种高效的空间数据结构——KD树的实现方法及其在最近邻搜索中的应用。包括KD树的节点结构定义、构建过程、插入操作及查询算法等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


int xycmp;
struct dian
{int xy[2],xiao[2],da[2];
}a[N];
bool cmp(dian a,dian b)
{
     return a.xy[xycmp]<b.xy[xycmp];
}
struct kdtree
{
int xia[N][2];
dian s[N],q;
   void up(int k)
   {
       int l=xia[k][0],r=xia[k][1];
   for(i=0;i<2;i++)
   {
    if(l)s[k].xiao=min(s[k].xiao,s[l].xiao),s[k].da=max(s[k].da,s[l].da);
    if(r)s[k].xiao=min(s[k].xiao,s[r].xiao),s[k].da=max(s[k].da,s[r].da);           
   }        
   }
  void add(int now,dian kk)
  {
       for(i=0;i<2;i++)
  s[now].xy[i]=s[now].xiao[i]=s[now].da[i]=kk.xy[i];    
  }
int dis(int k)
{
    int lin=0;
for(i=0;i<2;i++)lin+=max(s[k].xiao[i]-q.xy[i],0);
for(i=0;i<2;i++)lin+=max(q.xy[i]-s[k].da[i],0);
   
    return lin;
}
void build(int &k,int l,int r,int xydo)
{
    k=(l+r)>>1;xycmp=xydo;
    nth_element(a+l,a+k,a+r+1,cmp);
    add(k,a[k]);
    if(l<k)build(xia[k][0],l,k-1,xydo^1);
    if(r>k)build(xia[k][1],k+1,r,xydo^1);
    up(k);    
}
 
void ins(int k,int xydo)
{
     if(q.xy[xydo]<s[k].xy[xydo])
     {
      if(xia[k][0])ins(xia[k][0],xydo^1);
      else xia[k][0]=++n,add(n,q) ;                          
                                
     }else
     {
           if(xia[k][1])ins(xia[k][1],xydo^1);
      else xia[k][1]=++n,add(n,q) ;   
      }
     up(k);
}
    void zhao(int k)
    {
    ans=min(ans,abs(s[k].xy[1]-q.xy[1])+abs(s[k].xy[0]-q.xy[0]));
      int ld=(xia[k][0])?dis(xia[k][0]):inf;
      int rd=(xia[k][1])?dis(xia[k][1]):inf;
      if(ld<rd)
      {
      if(ld<ans)zhao(xia[k][0]);if(rd<ans)zhao(xia[k][1]);        
      }else
      {
           if(rd<ans)zhao(xia[k][1]);if(ld<ans)zhao(xia[k][0]); 
       }
    }       
}kd;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值