一种可以 高效处理 \(k\) 维空间信息 的数据结构。

在正确使用的情况下,复杂度为 \(O(n^{1-\frac{1}{k}})\).

K-D Tree 的实现

建树

随机一维选择最中间的点为当前子树的根,每个节点维护当前点的坐标,已经整个子树的矩形坐标。

Pink Rabbit 说随机选维度没什么问题。

int rt, ID;
struct node{ int lc, rc, x[K], L[K], R[K]; } t[N];
inline bool cmp(const node &a, const node &b){ return a.x[ID] < b.x[ID]; }
inline void getedge(int x){
lfo(i, 0, K) t[x].L[i] = t[x].R[i] = t[x].x[i];
if(ls(x)) lfo(i, 0, K) Min(t[x].L[i], t[ls(x)].L[i]), Max(t[x].R[i], t[ls(x)].R[i]);
if(rs(x)) lfo(i, 0, K) Min(t[x].L[i], t[rs(x)].L[i]), Max(t[x].R[i], t[rs(x)].R[i]);
}
void build(int &x, int l, int r){
if(l > r) return;
int mid = l + r >> 1; x = mid, ID = rand() % K;
nth_element(t + l, t + mid, t + r + 1, cmp);
build(ls(x), l, mid - 1), build(rs(x), mid + 1, r);
getedge(x);
}

插入/删除

  • 删除比较简单,直接标记为不存在即可,复杂度依然靠谱。
  • 插入比较麻烦,如果可离线的话,最好先建树,否则考虑 \(\sqrt n\) 次插入操作后重构整棵树。

复杂度分析

在递归过程中,判断是否继续是:

  • 相交:继续
  • 包含:打标记,return
  • 相离:return

则复杂度最优 \(O(\log n)\),最劣 \(O(n^{1-\frac{1}{k}})\)。

K-D Tree 的应用

  • 求最近点对的骗分做法。

  • 范围修改/查询问题:矩形覆盖,多维偏序……

[笔记] K-D Tree的更多相关文章

  1. [学习笔记]Dsu On Tree

    [dsu on tree][学习笔记] - Candy? - 博客园 题单: 也称:树上启发式合并 可以解决绝大部分不带修改的离线询问的子树查询问题 流程: 1.重链剖分找重儿子 2.sol:全局用桶 ...

  2. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  3. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

  4. 学习笔记——k近邻法

    对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...

  5. 决策树学习笔记(Decision Tree)

    什么是决策树? 决策树是一种基本的分类与回归方法.其主要有点事模型具有可得性,分类速度快.学习时,利用训练数据,根据损失函数最小化原则建立决策树模型:预测时,对新数据,利用决策树模型进行分类. 决策树 ...

  6. 【leetcode刷题笔记】Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  7. [学习笔记] Uplift Decision Tree With KL Divergence

    Uplift Decision Tree With KL Divergence Intro Uplift model 我没找到一个合适的翻译,这方法主要应用是,探究用户在给予一定激励之后的表现,也就是 ...

  8. 【学习笔记】K-D tree 区域查询时间复杂度简易证明

    查询算法的流程 如果查询与当前结点的区域无交集,直接跳出. 如果查询将当前结点的区域包含,直接跳出并上传答案. 有交集但不包含,继续递归求解. K-D Tree 如何划分区域 可以借助下文图片理解. ...

  9. 「算法笔记」Link-Cut Tree

    一.简介 Link-Cut Tree (简称 LCT) 是一种用来维护动态森林连通性的数据结构,适用于动态树问题. 类比树剖,树剖是通过静态地把一棵树剖成若干条链然后用一种支持区间操作的数据结构维护, ...

  10. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

随机推荐

  1. SpringCloud和Dubbo?

    SpringCloud和Dubbo都是现在主流的微服务架构SpringCloud是Apache旗下的Spring体系下的微服务解决方案Dubbo是阿里系的分布式服务治理框架从技术维度上,其实Sprin ...

  2. kafka中的broker 是干什么的?

     broker 是消息的代理,Producers往Brokers里面的指定Topic中写消息,Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,broker在中间起到一 ...

  3. 启动一个线程是调用 run()还是 start()方法?

    启动一个线程是调用 start()方法,使线程所代表的虚拟处理机处于可运行状态, 这意味着它可以由 JVM 调度并执行,这并不意味着线程就会立即运行.run()方 法是线程启动后要进行回调(callb ...

  4. 什么是持续集成(CI)?

    持续集成(CI)是每次团队成员提交版本控制更改时自动构建和测试代码的过程. 这鼓励开发人员通过在每个小任务完成后将更改合并到共享版本控制存储库来共 享代码和单元测试.

  5. mapper.xml文件中标签没有提示的解决

    1.首先我们来看看mapper.xml的头文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTY ...

  6. Django的多数据库与读写分离

    1.多个数据库 settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.pa ...

  7. Django中的信号signals

    什么是信号? jango的信号机制就是事件驱动模型,一个事件可以被多个函数注册,当一个动作行为触发了这个事件后,这个事件所对应的函数便执行相应的操作; 内置信号; django 内部有些定义好的sig ...

  8. Windows常用快捷操作

    Windows操作系统作为目前最广泛使用的PC端OS,掌握一些快捷键,方便快速在Windows系统下进行操作. 下面收集整理了一些常用的快捷操作: Ctrl + A   全选 Ctrl + C   复 ...

  9. PCB中加入任意LOGO图文说明 精心制作

    防静电图 首先我们要对下载下来的图片进行处理否则Altium designer6.9会提示装载的图片不是单色的,用Photoshop CS打开开始下载的图片 选择 图像→模式→灰度 在选择 图像→模式 ...

  10. SVG里的几个实用动画元素的用法

    由于刚刚接触svg,在w3school和菜鸟教程上面的简直是入门的入门,过于简洁,完全不利于学习,所以不得不在网上找了一些文章和资料来看看,对于svg动画这部分完全可以跟css3动画抗衡,现在整理一下 ...