一种可以 高效处理 \(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. 什么是openssl?

    在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份.这个包广泛被应用在互联网的网页服务器上.

  2. Mybatis框架基础入门(五)--输入映射和输出映射

    1.parameterType(输入类型) 1.1 传递简单类型 使用#{}占位符,或者${}进行sql拼接. <select id="caseCountByQueryCaseVo&q ...

  3. screen--后台不挂断运行

    方法一:1.进入项目目录下,运行下面程序:nohup python manage.py runserver 0.0.0.0:5008 &nohup(no hang up)用途:不挂断的运行命令 ...

  4. 在java web工程中jsp页面中使用kindeditor

    在这之前我们用Notepad++写过kindeditor 在Java web工程里也差不多 首先我们复制之前的thml代码粘贴到工程里 然后把样式也复制进去 然后就可以运行了

  5. 学习k8s(四)

    1.K8S核心组件 1.Master节点: etcd: 分布式键值对数据库,保存集群状态 api-server: 接受并响应用户的请求 controller: 控制器管理,控制容器的副本数,故障检测 ...

  6. Effective Java —— 多字段下考虑使用建造者模式构建实例

    本文参考 本篇文章参考自<Effective Java>第三版第二条"Consider a builder when faced with many constructor pa ...

  7. CommonsCollection2反序列链学习

    CommonsCollection2 1.前置知识 CmonnosCollection2需要用到Javassist和PriorityQueue 1.1.Javassist Javassist是一个开源 ...

  8. 论文解读( N2N)《Node Representation Learning in Graph via Node-to-Neighbourhood Mutual Information Maximization》

    论文信息 论文标题:Node Representation Learning in Graph via Node-to-Neighbourhood Mutual Information Maximiz ...

  9. python爬取梦幻西游召唤兽资质信息(不包含变异)

    一.分析 1.爬取网站:https://xyq.163.com/chongwu/ 2.获取网页源码: request.get("https://xyq.163.com/chongwu/&qu ...

  10. AS之去掉顶部标题栏

    在该目录下,将原本<style name的这行代码改为: <style name="Theme.Tongxunlu" parent="Theme.Materi ...