浅谈K-D Tree
初步认识\(K-D\) \(Tree\)
\(K-D\) \(Tree\)是一种基于空间分割的二叉树形数据结构,一般用于高维信息检索。因为\(OI\)中很多问题都能转化为高维信息检索,所以\(K-D\) \(Tree\)的用途十分广泛。
\(K-D\) \(Tree\)树高严格为\(logn\)每一个结点都代表着一个高维信息点。每一棵子树表示的范围是该子树内所有点的\(k\)维正交包围盒,左右子树代表的范围不相交。
建树
\(K-D\) \(Tree\)一般采用中位数循环切割的方式建树。假设当前结点是以第\(x\)维中位数分割成两棵子树的,那么当前节点的儿子结点就应该用第\((x+1)mod\) \(k\)维中位数来切割。以\(k=2\)为例:

总之就是切完\(x\)就切\(y\)啦。求中位数可以用\(\rm std::nth\)_\(\rm element()\),复杂度\(O(n)\),会把中位数放到序列中间来。
建树总时间复杂度:\(T(n)=2T(n/2)+O(n)=O(nlogn)\)
插入
就像二叉查找树一样一直搜索到底,作为叶子插入。但是数据不随机的时候有可能会使树退化成链,所以需要用到替罪羊树重构的方式保持平衡。均摊\(O(log^2n)\)。由于保持平衡的代价较大,所以不强制在线的时候,应该把插入换成激活,也就是先把这个点扔里面,但是处于未激活的状态,点上的信息不进入统计范围。激活之后就算是一个实实在在存在的结点了。
删除
不能真的从树里删掉某个点,因为那样会改变树的结构。用激活的反操作把它标记掉,如果要重构树的时候再清掉。
最近点查询
我们可以用\(O(1)\)的时间求出某个点到左右子树正交包围盒的最短距离,先去较小的那个子树里求答案,再来访问较大的子树。用最优性剪纸,如果当前最短距离比已经求出来的答案还大的话那就不访问这个子树了。在数据随机的情况下期望复杂度为\(O(logn)\)
正交范围查询
从根开始查询,如果当前子树与查询范围没有交集则直接退出,被完全包含就统计信息之后直接退出,否则递归访问左右子树。\(k\)维的\(k-d\) \(tree\)正交范围查询的复杂度是\(O(n^{\frac{k-1}{k}})\),\(k=2\)为例:
假设查询范围只有上边界和右边界,两层孩子一共\(4\)棵子树,每棵\(\frac{n}{4}\)个点。这\(4\)棵子树中有一棵完全被包含=\(O(1)\),\(2\)棵子树只有一个边界=\(2F(\frac{n}{4})\),还有一棵与原问题一致=\(T(\frac{n}{4})\)。
对于只有一个边界的问题来说,该边界只会与两棵子树相交,所以\(F(n)=2F(\frac{n}{4})+O(1)=O(\sqrt{n})\)
所以\(2\)维\(k-d\) \(tree\)的正交范围查询复杂度为\(T(n)=T(\frac{n}{4})+O(\sqrt{n})=O(\sqrt{n})\)
如果遇到\(TLE\),那么请第一时间来检查子树正交包围盒范围是否可能出错。
有没有可能通过空儿子得到错误的范围。最好一开始就把\(0\)结点的范围设成极值。
\(K-D\) \(Tree\)与传统树套树的比较
空间复杂度为\(O(n)\),不容易被卡空间。
结构简单并且支持复杂的操作。
便于剪枝,因为寻址快,效率一般更好。
浅谈K-D Tree的更多相关文章
- 浅谈k短路算法
An Old but Classic Problem 给定一个$n$个点,$m$条边的带正权有向图.给定$s$和$t$,询问$s$到$t$的所有权和为正路径中,第$k$短的长度. Notice 定义两 ...
- 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树
http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
- 浅谈分词算法(4)基于字的分词方法(CRF)
目录 前言 目录 条件随机场(conditional random field CRF) 核心点 线性链条件随机场 简化形式 CRF分词 CRF VS HMM 代码实现 训练代码 实验结果 参考文献 ...
- 浅谈分词算法(3)基于字的分词方法(HMM)
目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...
- cdq分治浅谈
$cdq$分治浅谈 1.分治思想 分治实际上是一种思想,这种思想就是将一个大问题划分成为一些小问题,并且这些小问题与这个大问题在某中意义上是等价的. 2.普通分治与$cdq$分治的区别 普通分治与$c ...
- (转)浅谈trie树
浅谈Trie树(字典树) Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问 ...
- 浅谈分词算法基于字的分词方法(HMM)
前言 在浅谈分词算法(1)分词中的基本问题我们讨论过基于词典的分词和基于字的分词两大类,在浅谈分词算法(2)基于词典的分词方法文中我们利用n-gram实现了基于词典的分词方法.在(1)中,我们也讨论了 ...
- 浅谈 Java集合
Java 集合 集合是对象的容器,定义了多个对象进行操作的常用方法,可实现数组的功能. Java集合类库所处位置:java.util.*. 与现代的数据结构类库的常见做法一样,Java集合类库也将接口 ...
- 浅谈Hybrid技术的设计与实现
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...
- Spring缓存框架原理浅谈
运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...
随机推荐
- 【Head First Servlets and JSP】笔记14:session再探 & Listener示例
对于session的“CRUD” 会话迁移 别忘了HttpSessionBindingListener Listener示例 1.session的“增”与“删”——session的创建和撤销的调用主体 ...
- JavaWeb CSS
1. CSS介绍 1.1. 什么是CSS CSS全称为Cascading Style Sheets,译为层叠样式表. 样式定义如何显示HTML元素. 样式通常存储在样式表中. 1.2. 百度百科 CS ...
- INSPIRED启示录 读书笔记 - 第5章 产品管理与软件开发
保持融洽的合作关系 形成合作关系的关键是双方承认彼此平等——任何一方不从属于另一方,产品经理负责定义正确的产品,开发团队负责正确地开发产品,双方相互依赖 产品经理要求开发团队完成任务,必须先取得他们的 ...
- SpringBoot 入门笔记
1. Spring 4.3中引入了: @GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping 2. @RequestMapp ...
- Kubernetes 待学习列表
1.EFK or ELK https://blog.csdn.net/mawming/article/details/78344939, https://www.jianshu.com/p/fe3ac ...
- maven junit.framework不存在问题解决
问题 在使用maven进行一个工程的编译,已加入junit包的依赖,编译的时候却总是报“junit.framework不存在”错误. pom.xml中junit包加入如下: <dependenc ...
- Logistic回归python实现
2017-08-12 Logistic 回归,作为分类器: 分别用了梯度上升,牛顿法来最优化损失函数: # -*- coding: utf-8 -*- ''' function: 实现Logistic ...
- 集成Spring web.xml配置总结
1.web.xml 的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet 1.serv ...
- java 类装载器原理
问题引入:getClass().getClassLoader().getResource(path),各自代表什么意思? 解答:getClass():获得当前对象所属的Class对象 getClass ...
- MYSQL进阶学习笔记一:MySQL编码设定,会话变量和全局变量!(视频序号:进阶_1-3)
知识点一:MySQL编码设定(1-2) 服务器编码设定: 查看MySQL服务器端的编码格式: SHOW VARIABLES LIKE ‘char%’; 设定编码格式: SET NAMES ‘utf8’ ...