Martian148's blog Martian148's blog
首页
  • ICPC 算法笔记
  • ICPC 算法题解
  • 体系结构
  • 高等数学
  • 线性代数
  • 概率论与数理统计
  • 具体数学
  • Martian148的奇思妙想
  • 游记
  • 通识课笔记
关于
  • useful 网站
  • 友情链接
  • 分类
  • 归档

Martian148

一只热爱文科的理科生
首页
  • ICPC 算法笔记
  • ICPC 算法题解
  • 体系结构
  • 高等数学
  • 线性代数
  • 概率论与数理统计
  • 具体数学
  • Martian148的奇思妙想
  • 游记
  • 通识课笔记
关于
  • useful 网站
  • 友情链接
  • 分类
  • 归档
  • 线上赛板子(实时更新)
  • 数据结构

    • 堆
    • 并查集
    • 树状数组
    • 分块
    • 树相关
    • 线段树
    • 平衡树
    • 树链剖分
    • LCT
    • 最近公共祖先
    • 虚树
    • 树分治
    • K-D Tree
      • 建树
      • 插入
      • 删除
    • 笛卡尔树
    • 珂朵莉树
  • 数学

  • 计算几何

  • 动态规划

  • 图论

  • 字符串

  • 杂项

  • 算法笔记
  • 数据结构
martian148
2024-09-03
目录

K-D Tree

# K-D Tree

一般的二叉树只能在每个节点上表示一个数据,如果需要在一个节点上表示多个数据,可以用 K-D 树

先假设维度是二维,那么先对 xxx 进行划分,分为左右两部分,求 xxx 的中位数 midmidmid 作为根,把 x<midx<midx<mid 的节点给左子树,x>midx>midx>mid 的节点给右子树

然后再对 yyy 进行划分,每个子树分成两部分 ,取每个子树中 yyy 的中位数 midmidmid ,把 y<midy<midy<mid 的节点给左子树,y>midy>midy>mid 的节点给右子树

第三次对 xxx 进行划分,第四次对 yyy 进行划分,以此类推...

image.png

这种划分的方式叫做轮转法,即有 kkk 维,1⋯k1\cdots k1⋯k 第 iii 次划分第 (i−1)%k+1(i-1)\%k+1(i−1)%k+1 维

还有一种划分方式,叫做最大方差法,适用于某些维度的值变化不大的情况,例如二维平面中 xxx 均匀分布,yyy 相差不大,nnn 个点再平面上呈一条横先,此时按照 yyy 划分没有太大意义,可以每次都按 xxx 划分,具体操作就是每次划分时,选择方差最大的维度进行划分,方差的定义为 s2=1n∑i=0n−1(xi−μ)2s^2=\frac{1}{n}\sum\limits_{i=0}^{n-1}(x_i-\mu)^2s2=n1​i=0∑n−1​(xi​−μ)2

# 建树

如果预先给定了 nnn 个数据,那么用递归建就可以了

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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 插入

插入新节点,按照 K-D 树的规则,在 K-D 树上找到需要插入的位置,然后插入

如果发现不平衡,可以利用替罪羊树,推倒重建

# 删除

同理,也可以使用替罪羊树的删除方法,替罪羊树可以看成是一维的 K-D 树,K-D 树是替罪羊树的拓展

上次更新: 2025/04/08, 18:03:31
树分治
笛卡尔树

← 树分治 笛卡尔树→

最近更新
01
计算机网络笔记
06-13
02
LLM101 NLP学习笔记
06-02
03
《python科学计算入门》学习笔记
05-30
更多文章>
Theme by Vdoing | Copyright © 2024-2025 Martian148 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式