参考:https://trinkle23897.github.io/pdf/K-D%20Tree.pdf

  KD-Tree是一种维护K维空间点的类似BST的数据结构。绝大多数时候只用来维护二维空间的点,因为维度越高复杂度越辣鸡。下面只考虑平面上的KD-Tree,即2D-Tree。

  KD-Tree以分割平面来实现类似BST的建树。具体的,取该坐标中位数(即相当于划了一条直线)将点集划分成两部分,刚好被取作中位数的点放在该节点,并记录该节点管辖的平面区域范围。剩余的点分别放进左右儿子,递归建树。由于只需要按中位数分割,可以使用nth_element去掉排序的log。每次用来划分的维度应交替(或者随机,总之越均匀越好)选择,以保证之后查询的玄学复杂度。建树复杂度显然是O(nlogn)。

  KD-Tree最常用的是用来查找某点的曼哈顿/欧几里得距离最近点。具体做法实际上就是A*,即考虑应该往一个节点的左儿子还是右儿子继续查找时,通过节点的平面区域范围给它一个估价函数(当然不劣于实际),如果估价劣于已经找到的最优答案,当然不继续递归,否则优先递归估价较优的。据说复杂度随机O(logn),能卡到O(√n)。

  同时KD-Tree还可以滋磁矩形查询。具体做法实际上就是线段树,即如果当前节点所管辖的范围被查询范围包含,直接返回该节点答案,否则暴力递归左右节点查询。复杂度同样是O(√n),丝毫不会证。

  插入一个点是非常正常的操作,但是在KD-Tree里插入点有和BST一样的问题,即一不小心就不平衡了。如果可以离线,事实上可以先给所有点建好KD-Tree,将一开始不存在的点打上标记,实际插入该点时清除标记激活该点。如果强制在线,同样根据建树的方式找到点的插入位置,使用替罪羊式的重构或定期重构。

KD-Tree学习笔记的更多相关文章

  1. k-d tree 学习笔记

    以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...

  2. K-D Tree学习笔记

    用途 做各种二维三维四维偏序等等. 代替空间巨大的树套树. 数据较弱的时候水分. 思想 我们发现平衡树这种东西功能强大,然而只能做一维上的询问修改,显得美中不足. 于是我们尝试用平衡树的这种二叉树结构 ...

  3. kd tree学习笔记 (最近邻域查询)

    https://zhuanlan.zhihu.com/p/22557068 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 KD树 ...

  4. 珂朵莉树(Chtholly Tree)学习笔记

    珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...

  5. dsu on tree学习笔记

    前言 一次模拟赛的\(T3\):传送门 只会\(O(n^2)\)的我就\(gg\)了,并且对于题解提供的\(\text{dsu on tree}\)的做法一脸懵逼. 看网上的其他大佬写的笔记,我自己画 ...

  6. Link Cut Tree学习笔记

    从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...

  7. 矩阵树定理(Matrix Tree)学习笔记

    如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/64 ...

  8. splay tree 学习笔记

    首先感谢litble的精彩讲解,原文博客: litble的小天地 在学完二叉平衡树后,发现这是只是一个不稳定的垃圾玩意,真正实用的应有Treap.AVL.Splay这样的查找树.于是最近刚学了学了点S ...

  9. LSM Tree 学习笔记——本质是将随机的写放在内存里形成有序的小memtable,然后定期合并成大的table flush到磁盘

    The Sorted String Table (SSTable) is one of the most popular outputs for storing, processing, and ex ...

  10. LSM Tree 学习笔记——MemTable通常用 SkipList 来实现

    最近发现很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等.之前还没有留意这么设计的原因,最近 ...

随机推荐

  1. 手机视频编辑软件APP

    1. VUE    iOS/Android 2.Alive    iOS/Android 3.Splice  iOS 4. Plotagragh+   能让照片动起来的app 5.Cinepic  能 ...

  2. 1.3《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——手册页

    我们运行的命令行程序,通常在技术上称作shell, 它包含了一个非常强大(也很神秘)的工具,我们将用它来学习更多可用的命令.这个工具本身就是个称作'man'的命令('manual'的简写).它的参数是 ...

  3. Exp4 恶意代码分析 20155223

    Exp4 恶意代码分析 20155223 使用原生命令schtasks监视系统运行 在系统盘目录下建立脚本文件netstatlog.bat,包含以下命令: date /t >> c:\ne ...

  4. Js读取XML文件为List结构

    习惯了C#的List集合,对于Javascript没有list 极为不舒服,在一个利用Js读取XML文件的Demo中,决定自己构建List对象,将数据存入List. 第一步,Js读取XML文件知识 X ...

  5. EEPROM---AT24Cxx应用介绍

    结论:1.读写AT24CXX芯片,根据容量有多种方式:一.容量为AT24C01~AT24C16,首先发送设备地址(8位地址),再发送数据地址(8位地址),再发送或者接受数据. 二.AT24C32/AT ...

  6. 初识TPOT:一个基于Python的自动化机器学习开发工具

    1. TPOT介绍 一般来讲,创建一个机器学习模型需要经历以下几步: 数据预处理 特征工程 模型选择 超参数调整 模型保存 本文介绍一个基于遗传算法的快速模型选择及调参的方法,TPOT:一种基于Pyt ...

  7. 巧用cheerio重构grunt-inline

    grunt-inline是楼主之前写的一个插件,主要作用是把页面带了__inline标记的资源内嵌到html页面去.比如下面的这个script标签. <script src="main ...

  8. 微信小程序中跳转另一个小程序

    wx.navigateToMiniProgram({ appId: 'xxxxxxxxxxxxxxxxxx', // 要跳转的小程序的appid path: 'page/index/index', / ...

  9. PWM输出

    PWM(Pulse Width Modulation),脉冲宽度调制. 脉冲的频率由ARR控制,ARR越大频率越小:占空比由CCRx控制,CCRx越小占空比越大. 捕获/比较通道的输出部分(通道1) ...

  10. Unity利用SMSSDK实现短信验证码(附代码)

    最近一直在研究如何给app更多实用性的功能,在app进行登录或者注册时,为了方便用户更加快捷的完成登录功能,所以就决定采用短信验证码的方式进行验证登录.在学习的过程中,先使用了Mob的短信服务进行短信 ...