【学习笔记】K-D tree 区域查询时间复杂度简易证明
查询算法的流程
- 如果查询与当前结点的区域无交集,直接跳出。
- 如果查询将当前结点的区域包含,直接跳出并上传答案。
- 有交集但不包含,继续递归求解。
K-D Tree 如何划分区域
可以借助下文图片理解。
我们不仅可以将 K-D Tree 理解为一个高维二叉搜索树,通过某一维标准值进行元素的划分。
还可以理解为使用一些直线(线段或射线)将整个空间划分为若干个区域,便于缩小搜索范围,以达到剪枝的目的。
2-D 查询复杂度证明
有问题请在评论区指出,谢谢!
可以知道,时间开销最大的地方在于流程中“有交集但不包含”情况的处理。设这样的点的个数为 \(x\),那么查询一次的时间复杂度为 \(O(x)\)
我们先放张图,假定查询是一个竖直线(询问区域在左边):

可以清晰地看见 K-D Tree 如何划分区域的:根结点、直接儿子、第三代子孙、第四代……,它们分别交替着划分第一维,第二维。
直接去考虑 \(x\) 的规模大小并不容易,不如尝试着研究它的剪枝情况。
首先,第一次我们的剪枝是有效的,右侧一半会被剪掉,那么往下结点数不翻倍。
首先,第二次我们的剪枝是无效的,那么往下结点数翻倍。
第三次有效,第四次无效……
这样一来,只有奇数层会有剪枝效果,偶数曾则没有。一颗 \(h\) 层的 K-D Tree,有 \(\frac{h}{2}\) 次翻倍,因此 \(x \approx \sum_{i=0}^{\frac{h}{2}} 2^i \approx 2^{\frac{h}{2}}\)。
由于带有替罪羊重构的 K-D Tree 是平衡的,那么 \(h \approx \log_2 n\)。
于是 \(x\approx 2^{\frac{h}{2}} = (2^{\log_2 n})^{0.5} = n^{0.5}\)
所以一次矩形查询的复杂度为 \(O(\sqrt{n})\)。
最后放张图,其中灰色结点是搜索范围(原图出处):

K-D 查询复杂度证明
我们不难将 2-D 的证明推广之 \(k\) 维。
那么只有在 \(k\) 维中的一维才会有剪枝效果,其他维度结点都会 \(\times 2\)。
那么 \(\Large x \approx \sum\limits_{i=1}^{\frac{h(k-1)}{k}} 2^i \approx 2^{\frac{h(k-1)}{k}}\)。其中 \(h \approx \log_2 n\) 为树高。
\(\Large x \approx 2^{\frac{h(k-1)}{k}} = (2^{\log_2 n})^\frac{k-1}{k} = n^{\frac{k-1}{k}}\)。
由于还有一次 \(k\) 个维度的比较,那么一次就是 \(\Large O(k\cdot n^{\frac{k-1}{k}})\) 的时间复杂度。
后记
证明过程可能不是很严谨,有问题请指出。
reference:l1ll5 - K-D tree在信息学竞赛中的我也不知道有什么的应用
- 原文地址:https://www.cnblogs.com/-Wallace-/p/13429463.html
- 本文作者:@-Wallace-
- 转载请附上出处。
【学习笔记】K-D tree 区域查询时间复杂度简易证明的更多相关文章
- [学习笔记]Dsu On Tree
[dsu on tree][学习笔记] - Candy? - 博客园 题单: 也称:树上启发式合并 可以解决绝大部分不带修改的离线询问的子树查询问题 流程: 1.重链剖分找重儿子 2.sol:全局用桶 ...
- Dynamic CRM 2015学习笔记(3)oData 查询方法及GUID值比较
本文将比较二种查询字符串在同一个oData查询方法中的不同,另外,还将介绍如何比较不同方法返回的GUID的值. 用同一个oData查询方法,如果传入查询的字符串不一样,返回结果的格式竟然完全不一样. ...
- FFmpeg常用命令学习笔记(一)基本信息查询命令
笔者才开始学习音视频开发,FFmpeg学习笔记系列主要是从慕课网李超老师的FFmpeg音视频核心技术精讲与实战课程学习的心得体会. FFmpeg音视频核心技术精讲与实战:https://coding. ...
- 【JAVAWEB学习笔记】21_多条件查询、attr和prop的区别和分页的实现
今天主要学习了数据库的多条件查询.attr和prop的区别和分页的实现 一.实现多条件查询 public List<Product> findProductListByCondition( ...
- 学习笔记——k近邻法
对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...
- 决策树学习笔记(Decision Tree)
什么是决策树? 决策树是一种基本的分类与回归方法.其主要有点事模型具有可得性,分类速度快.学习时,利用训练数据,根据损失函数最小化原则建立决策树模型:预测时,对新数据,利用决策树模型进行分类. 决策树 ...
- [学习笔记] Uplift Decision Tree With KL Divergence
Uplift Decision Tree With KL Divergence Intro Uplift model 我没找到一个合适的翻译,这方法主要应用是,探究用户在给予一定激励之后的表现,也就是 ...
- ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
- MongoDB学习笔记~MongoVUE对数据进行查询,排序和按需显示
回到目录 对于MongoDB这个非关系型数据库(NoSql)来说,找一个IDE工具不是很容易,还好被我找到了,它就是大名鼎鼎的MongoVUE,它可以对mongodb数据表进行增删改查,下面我主要说一 ...
随机推荐
- C语言环境总结
1.虚拟内存下C语言环境 2.main函数调用 3.栈调用 每次函数调用,在栈中分配一个栈帧,寄存器通过持有该栈帧的基地址,并上下偏移,访问形参和本地变量, C语言形参为一个字大小,所以通常传指针,这 ...
- git-关联远程git仓库详细步骤-2
1.打开git bash,在控制台中输入以下命令:ssh-keygen -t rsa -C "邮箱地址" 结果: fanxi@AT8350 MINGW64 ~$ ssh-keyge ...
- linux打包 压缩 解压tar常归操作
tar 打包 tar -cvf 打包后路径和文件名.tar 需要打包的路径和文件压缩 tar -zcvf 打包后路径和文件名.tar.gz 需要打包的路径和文件解压 tar -xvf 包名 -C 路径 ...
- 循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储
在我们一些系统里面,有时候会需要一些让用户自定义的数据信息,一般这些可以使用扩展JSON进行存储,不过每个业务表的显示项目可能不一样,因此需要根据不同的表单进行设计,然后进行对应的数据存储.本篇随笔结 ...
- Nginx下关于缓存控制字段cache-control的配置说明
HTTP协议的Cache -Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程.请求时的缓存指令包括: no ...
- iOS程序内实现版本更新
最近这段时间刚把手头里面的两个项目交付出去,很想写点东西但又不想随随便便的写些抒情的文字,其实生活中的很多事情.成长的路上遇到的很多问题,并非简简单单的抱怨.埋怨,用一种激情悲昂的情绪去逃避.去发泄所 ...
- http 文件上传
参考https://www.cnblogs.com/yuwei0911/p/8601542.html
- 加快alter table
mysql的alter table操作的性能对打表来说是个大问题. mysql执行大部分修改表结构的方法是用新的结构创建一个空表,从旧表中查出所有的数据插入新表,然后删除旧表.这样操作就可能需要花费很 ...
- mark一下2020已经阅读的书单专栏和源码
1.书籍 已经阅读: 深度工作 代码整洁之道 正在阅读: 敏捷软件开发 程序员修炼之道 程序员思维 计划阅读: 人月神话 数据密集型系统设计 如何阅读一本书 卓有成效的管理者 算法 第四版 sprin ...
- 使用wapiti进网站进行安全性测试
1.安装wapiti --在命令终端输入 pip install wapiti3 (因为这个结合python使用,所以安装的版本要跟python兼容,因为我的python是3.6版本,所以安装的是wa ...