查询算法的流程

  • 如果查询与当前结点的区域无交集,直接跳出。
  • 如果查询将当前结点的区域包含,直接跳出并上传答案。
  • 有交集但不包含,继续递归求解。

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在信息学竞赛中的我也不知道有什么的应用

【学习笔记】K-D tree 区域查询时间复杂度简易证明的更多相关文章

  1. [学习笔记]Dsu On Tree

    [dsu on tree][学习笔记] - Candy? - 博客园 题单: 也称:树上启发式合并 可以解决绝大部分不带修改的离线询问的子树查询问题 流程: 1.重链剖分找重儿子 2.sol:全局用桶 ...

  2. Dynamic CRM 2015学习笔记(3)oData 查询方法及GUID值比较

    本文将比较二种查询字符串在同一个oData查询方法中的不同,另外,还将介绍如何比较不同方法返回的GUID的值. 用同一个oData查询方法,如果传入查询的字符串不一样,返回结果的格式竟然完全不一样. ...

  3. FFmpeg常用命令学习笔记(一)基本信息查询命令

    笔者才开始学习音视频开发,FFmpeg学习笔记系列主要是从慕课网李超老师的FFmpeg音视频核心技术精讲与实战课程学习的心得体会. FFmpeg音视频核心技术精讲与实战:https://coding. ...

  4. 【JAVAWEB学习笔记】21_多条件查询、attr和prop的区别和分页的实现

    今天主要学习了数据库的多条件查询.attr和prop的区别和分页的实现 一.实现多条件查询 public List<Product> findProductListByCondition( ...

  5. 学习笔记——k近邻法

    对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...

  6. 决策树学习笔记(Decision Tree)

    什么是决策树? 决策树是一种基本的分类与回归方法.其主要有点事模型具有可得性,分类速度快.学习时,利用训练数据,根据损失函数最小化原则建立决策树模型:预测时,对新数据,利用决策树模型进行分类. 决策树 ...

  7. [学习笔记] Uplift Decision Tree With KL Divergence

    Uplift Decision Tree With KL Divergence Intro Uplift model 我没找到一个合适的翻译,这方法主要应用是,探究用户在给予一定激励之后的表现,也就是 ...

  8. ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

  9. MongoDB学习笔记~MongoVUE对数据进行查询,排序和按需显示

    回到目录 对于MongoDB这个非关系型数据库(NoSql)来说,找一个IDE工具不是很容易,还好被我找到了,它就是大名鼎鼎的MongoVUE,它可以对mongodb数据表进行增删改查,下面我主要说一 ...

随机推荐

  1. lua调用dll demo

    使用的是lua5.3 DllMain.cpp 1 //生成的dll 是 lua_add53.dll 2 //luaopen_lua_add 3 extern "C" { 4 #in ...

  2. 基于FFmpeg的Dxva2硬解码及Direct3D显示(三)

    初始化Direct3D 目录 初始化Direct3D 创建Direct3D物理设备对象实例 创建Direct3D渲染设备实例 创建Direct3D视频解码服务 Direct3D渲染可以通过Surfac ...

  3. rgw的rgw_thread_pool_size配置调整

    前言 在比对rgw的不同前端的区别的时候,官方说civetweb是通过线程池来控制连接的,beast是后面加入了流控相关的,这块一直也没有调整过相关的参数,然后通过ab压测了一下,还是有很明显的区别的 ...

  4. Python_图解教程

    说明:本教程用图片+源码讲解Python常见的问题,共勉! 1.Python包的调用   # coding:utf8 # from pakge.mymodel import test from bao ...

  5. IDA-hook so层方法与java之间的映射关键

    第一步 1.首先用ida打开so文件 第二步 第三步

  6. classmethod、staticclassmethod内置装饰器函数

    # method 英文是方法的意思 # classmethod 类方法 # 当一个类中的方法中只涉及操作类的静态属性时,此时在逻辑上,我们想要直接通过类名就可以调用这个方法去修改类的静态属性,此时可以 ...

  7. 新鲜出炉!两万月薪的Java工程师面试题,看看你能做出来多少?

    接口和抽象类的区别 接口. 一个类实现了多个接口,那么必须实现接口中所有的抽象方法,如果方法相同,那么只需要Override一次. 所有接口中的默认方法也可以被继承,但是如果两个接口有重名的默认方法, ...

  8. guitar pro系列教程(二十七):Guitar Pro教程之理解记谱法

    前面的章节我们讲解了很多关于Guitar Pro'的功能使用,今天小编还是采用图文结合的方式为大家讲解它的理解记谱法,对于很多新人来说,在我们看谱之前,我们肯定要先熟悉他的一些功能如何使用以及一些关于 ...

  9. React Native两种加载图片的方式

    1 加载网络图片 通过uri就可以加载网络图片 <Image source={{uri:'http://facebook.github.io/react/img/logo_og.png'}} s ...

  10. jQuery 根据value设置radio默认选中

    jQuery 根据value设置radio默认选中:HTML: <input type="radio" name="type" value="1 ...