浅谈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(默 ...
随机推荐
- XML文件结构和基本语法
XML文件的结构性内容,包括节点关系以及属性内容等等.元素是组成XML的最基本的单位,它由开始标记,属性和结束标记组成.就是一个元素的例子,每个元素必须有一个元素名,元素可以若干个属性以及属性值. x ...
- rem布局原理
昨天去面试,面试官竟然说他们用媒体查询针对不同的屏幕宽度做了9个不同的rem布局,呵呵... eg: html{font-size:20px;} div{width:16rem;height:100p ...
- 20165101 实验一 Java开发环境的熟悉
#20165103 实验一 Java开发环境的熟悉 实验报告 封面 实验要求 第一部分 1.建立"自己学号exp1"的目录 2.在"自己学号exp1"目录下建立 ...
- Centos6.5安装Mysql5.6.10
1. 先卸载掉老版本的mysql(linux严格区分大小写,查找的时候加上-i参数,和mysql相关的全部要卸) [root@liuchao ~]# rpm -qa | grep -i mysqlMy ...
- how to use Inspector in fiddler
打开fiddler之后,会自动捕获本机的http请求,以列表的形式显示在左侧 双击左侧列表中的某一个request,右侧会自动切换到Inspectors窗口. 右侧上半部分是request的raw G ...
- UVA 10909 Lucky Number(树状数组+二分+YY)
此题测试时预处理等了很久,结果470ms过了...... 题意:开始不怎么懂,结果发现是这个: 波兰裔美国数学家斯塔尼斯拉夫·乌拉姆(Stanislaw Ulam)在20世纪50年代中期开发出了另一种 ...
- scapy学习笔记(2)
一.包 包(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”.其主要由“目的IP地址”.“源IP地址”.“净载数据”等部分构成,包括包头和包体,包头是固定长度,包体的长度不定, ...
- hdu 5895 Mathematician QSC 指数循环节+矩阵快速幂
Mathematician QSC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- Myeclipse快捷键(二)
Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ ...
- 彻底弄清python的切片
lis = range(100) # [0, 1, 2, 3, ..., 99] # 取前10个 lis[:10] # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 取后10个 l ...