KD-Tree学习笔记
参考: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学习笔记的更多相关文章
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...
- K-D Tree学习笔记
用途 做各种二维三维四维偏序等等. 代替空间巨大的树套树. 数据较弱的时候水分. 思想 我们发现平衡树这种东西功能强大,然而只能做一维上的询问修改,显得美中不足. 于是我们尝试用平衡树的这种二叉树结构 ...
- kd tree学习笔记 (最近邻域查询)
https://zhuanlan.zhihu.com/p/22557068 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 KD树 ...
- 珂朵莉树(Chtholly Tree)学习笔记
珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...
- dsu on tree学习笔记
前言 一次模拟赛的\(T3\):传送门 只会\(O(n^2)\)的我就\(gg\)了,并且对于题解提供的\(\text{dsu on tree}\)的做法一脸懵逼. 看网上的其他大佬写的笔记,我自己画 ...
- Link Cut Tree学习笔记
从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...
- 矩阵树定理(Matrix Tree)学习笔记
如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/64 ...
- splay tree 学习笔记
首先感谢litble的精彩讲解,原文博客: litble的小天地 在学完二叉平衡树后,发现这是只是一个不稳定的垃圾玩意,真正实用的应有Treap.AVL.Splay这样的查找树.于是最近刚学了学了点S ...
- LSM Tree 学习笔记——本质是将随机的写放在内存里形成有序的小memtable,然后定期合并成大的table flush到磁盘
The Sorted String Table (SSTable) is one of the most popular outputs for storing, processing, and ex ...
- LSM Tree 学习笔记——MemTable通常用 SkipList 来实现
最近发现很多数据库都使用了 LSM Tree 的存储模型,包括 LevelDB,HBase,Google BigTable,Cassandra,InfluxDB 等.之前还没有留意这么设计的原因,最近 ...
随机推荐
- 修复在“Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决”这篇博客中MyScrollView出现滑动一会就不会上下滑动的问题
在“Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决”,这篇博客中的大部分问题已经解决了. 唯一遗憾的是,ViewPage随人能够工作了,但是My ...
- 如何在Drupal7中用代码批量创建节点、评论和分类
最近,我忙于一个网站迁移工作.网站是使用某个老式CMS建立的,有一定数量的文章.不同的分类数据和用户评论.我的团队被雇来把这些数据从这个浪费人力物力的老式CMS上完整的迁移到功能更现代的开源Drupa ...
- 关于Android开发环境的演变
是不是我天生就不适合安装软件——经过eclipse.jdk.Android Studio的历次安装,我发觉自己似乎永远都装不好.去年eclipse断断续续装了三四天,那时希望能附加C++的软件包,却始 ...
- Spark内部流程图
转载自:https://blog.csdn.net/refuil/article/details/52055104
- BQMeetup
BQMeetup 时间:2017.12.19 地点:北京东城区东直门国华投资大厦1105
- How develop BigData Project in Visual Studio
- VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。
原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...
- FAT32文件系统学习(2) —— FAT表
1.题外话 在继续本文学习FAT32文件系统之前,先来插入一点别的话题.我们都知道U盘有一个属性是容量,就拿笔者的U盘为例,笔者手上的U盘是金士顿的DataTraveler G3 4GB的一个U盘.电 ...
- libgdx判断actor与circle是否重叠
实质是检测矩形与circle是否重叠 基本函数,判断点是否在circle中 public static boolean IsInside( float x, float y, Circle circl ...
- idea 开启 tomcat 访问日志记录
all 为 设置为 查看所有类型的请求 (包括ajax)