查询算法的流程
- 如果查询与当前结点的区域无交集,直接跳出。
- 如果查询将当前结点的区域包含,直接跳出并上传答案。
- 有交集但不包含,继续递归求解。
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数据表进行增删改查,下面我主要说一 ...
随机推荐
-
第64课 C++中的异常处理(上)
1. C++内置的异常处理:try-catch (1)try语句处理正常代码逻辑 (2)catch语句处理异常情况 (3)try语句中的异常由对应的catch语句处理,如果对应的catch中没有处理该 ...
-
PHP历程(PHP与MYSQL数据库之间连接、创建和关闭)
<?php define('WXLEVELS_DB_HOST','127.0.0.1'); //服务器 define('WXLEVELS_DB_USER','root'); //数据库用户名 d ...
-
使用NHibernate(3)-- 用代码代替配置文件
1,用代码配置Configure类. 上一篇“让代码跑起来”中,是通过在Web.config配置来实现Configure类的,NHibernate还提供了代码的方式. 把之前的配置都注释掉,然后修改A ...
-
wp8 入门到精通 抓包
抓包工具Fiddler的使用 Fiddler是一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据.我们可以利用它来检测网页和服务器的交互情况.下面,我们以http://bl ...
-
jquery如何实现domReady和onload判断的
function ready(fn) { var completed = function() { if ( document.addEventListener ) { document.remove ...
-
advanced dom scripting dynamic web design techniques Part One DOM SCRIPTING IN DETAIL CHAPTER 1 DO IT RIGHT WITH BEST PRACTICES
You’re excited; your client is excited. All is well. You’ve just launched the client’s latest websit ...
-
KVM 命令行启动第一台虚拟机
KVM创建第一台虚拟机 1 创建一个镜像 [root@kvm ~]# qemu-img create -f raw /opt/CentOS6.-x86_64.raw 5G Formatting [ro ...
-
如何知道我 的python是32位还是64位的?
方法一: 打开IDLE,看第一行提示,例如: 32位系统是这样的 Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.19 ...
-
用windows计划任务执行一些内容的写法,
用windows计划任务执行一些内容的写法, 以下示例: 1.创建ws对象 2.关闭java进程 3.执行bat文件 start.vbe文件内容 set ws=wscript.createobject ...
-
接口文档管理神器RAP2安装和部署
目录 一 RAP2 二 RAP2 安装需要的环境 2. 1 Node.js 安装: 2. 2 Mysql 5.7+ 安装 2 .3 Redis 安装见文章 2. 4 后端 rap2-delos 安装 ...