吐槽
kd-tree这个东西很早就听说过了但是qwq一直没有去了解

(原因的话。。啊哈哈听说是什么跟二维平面之类的东西有关的所以就怂掉了qwq没错就是怂qwq)

但其实好像。。真的很暴力啊qwq知道思路之后随便乱搞系列qwq

时间复杂度什么的应该是玄学恩qwq(网上看到有dalao说期望复杂度是O(n^(d-1)/d),不会证就是这样qwq)

正题

首先kd-tree是一棵类似二叉查找树的东西

拿二维的kd-tree为例,每个数据有两个关键值\(x\)和\(y\)

那么kd-tree的总的思路就是,每层根据一个关键值(记为\(val\)好了)来排序,这两个关键值轮着来(其实就是。。第一层按照\(x\)排序,第二层\(y\),然后第三层又是\(x\),以此类推)

kd-tree满足的性质是,\(x\)左子树中所有节点的\(val\)小于\(x\)的\(val\),右子树中所有节点的\(val\)大于\(x\)的\(val\)

比如说我们现在要构建\(n\)组数据的kd-tree,那么方法很简单

首先stl有一个十分吼的东西叫做nth_element(),具体用法是将\([l,r]\)这个区间内的第\(k\)个数放到这段区间中的第\(k\)个位置,然后前面的数小于它,后面的数大于它,但是不保证有序

调用:nth_element(a+l,a+mid,a+r+1,cmp)

如果说没有修改操作(bzoj2850),那么就是递归处理,build(),每次把区间的中间那个数拎出来,用nth_element处理一下,然后左边的就是mid的左子树,右边的就是右子树,然后递归处理

(所以说就是怎么乱搞都ok啦ovo)

那么这个东西有啥用呢?其实就是相当于排了个序,我们对于每个节点多维护4个值,分别是\(i\)子树下\(x\)的最大最小值和\(y\)的最大最小值,然后再维护其他的东西(什么sum啊之类的具体题目具体分析)

这样如果说我要查某个范围,我就能快速判断出这个子树是否需要遍历,如果说没有交集直接跳过,如果完全包含那直接把整个子树的信息拿来更新答案之类的,如果部分包含那就没办法了老老实实遍历咯

写起来还是十分简洁的ovo

如果说有修改操作(bzoj4066),那么就不能预处理出整棵kd-tree了,要一个一个点insert之类的

insert的话其实也很简单,就是按照前面说的排序方式每次判断小于的话就往左子树走反之右子树,找到应该在的位置把信息存进去就好了

但是这就涉及到一个问题,这样添加的话是可能退化成一条链的。。那就很gg了

所以我们需要不定时重构(有没有想到替罪羊啊哈哈哈。。好吧其实重构的方式确实有点像恩qwq)

其实就是把当前得到的所有值跑一遍无修改操作的build函数就好了

这样就可以保证变成一条链的样子不会持续太久。。那么复杂度就会优秀很多了(然而还是玄学qwq)

可以用来处理一些强制在线的区间修改查询,甚至可以用来处理一些cdq分治的题目(hdu5126)

大概就是这样咯ovo

【learning】kd-tree的更多相关文章

  1. 【数据结构】K-D Tree

    K-D Tree 这东西是我入坑 ICPC 不久就听说过的数据结构,但是一直没去学 QAQ,终于在昨天去学了它.还是挺好理解的,而且也有用武之地. 目录 简介 建树过程 性质 操作 例题 简介 K-D ...

  2. 【BZOJ】2631: tree LCT

    [题意]给定n个点的树,每个点初始权值为1,m次操作:1.x到y的点加值,2.断一条边并连一条边,保证仍是树,3.x到y的点乘值,4.x到y的点权值和取模.n,m<=10^5. [算法]Link ...

  3. 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并

    [BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...

  4. 【题解】Digit Tree

    [题解]Digit Tree CodeForces - 716E 呵呵以为是数据结构题然后是淀粉质还行... 题目就是给你一颗有边权的树,问你有多少路径,把路径上的数字顺次写出来,是\(m\)的倍数. ...

  5. 【题解】[P4178 Tree]

    [题解]P4178 Tree 一道点分治模板好题 不知道是不是我见到的题目太少了,为什么这种题目都是暴力开值域的桶QAQ?? 问点对,考虑点分治吧.直接用值域树状数组开下来,统计的时候直接往树状数组里 ...

  6. 【数据结构与算法】k-d tree算法

    k-d tree算法 k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点 ...

  7. 【学习笔记】K-D tree 区域查询时间复杂度简易证明

    查询算法的流程 如果查询与当前结点的区域无交集,直接跳出. 如果查询将当前结点的区域包含,直接跳出并上传答案. 有交集但不包含,继续递归求解. K-D Tree 如何划分区域 可以借助下文图片理解. ...

  8. 【总结】Link-Cut Tree

    这是一篇关于LCT的总结 加删边的好朋友--Link Cut Tree Link-Cut Tree,LCT的全称 可以说是从树剖引出的问题 树剖可以解决静态的修改或查询树的链上信息:那如果图会不断改变 ...

  9. 【Learning】分数规划

    分数规划 ​ 分数规划是一类决策性问题.一般地,题目会要求你针对问题规划一种方案,使得其代价函数最小或最大.其中,代价函数一般是分数形式,且分子分母的构成元素一般呈现一一对应关系. 直接上例题观察:B ...

  10. 【learning】洲阁筛

    问题描述 快速求素数处点值比较好求的积性函数前缀和 大致过程 Step1.求出一定范围内的素数处点值之和(\(g\)) Step2.利用上面的\(g\)求出一个\(f\)然后用\(f\)求出前缀和 具 ...

随机推荐

  1. springmvc+mybatis+mysql 数据库插入中文是乱码

    java web项目,前台页面的表单数据,插入到数据库时,结果出现乱码"???"的问题,断断续续折腾了一天时间,废话不说,步骤如下: 一:在web.xml中配置:编码格式拦截器 & ...

  2. Centos/linux下的JDK安装

    1.连接到centos的远程主机上 #你的用户名 ssh root@xxxxx 2.输入密码登录 3.最好将镜像改为阿里云的镜像 http://mirrors.aliyun.com/help/cent ...

  3. CentOS常用命令搜集

    centos是32或者64位:getconf LONG_BIT

  4. iOS isa指针

    在Objective-C中,任何类的定义都是对象.类和类的实例没有任何本质上的区别.任何对象都有isa指针. isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,它指向对象的类,而C ...

  5. 危化品速查APP--Android Project

    开发环境 Android studio 2.3.1 功能描述 集成多种查询方式,查看本地数据库中危险化学品的信息: 按照中文拼音和英文首字母,对化学品进行查询: 按照UN号或者CAS号查询相应的化学品 ...

  6. UVA-818 dfs + 位运算

    暴力枚举一些圆环,将这些圆环解开,看能否成为单链.判断单链的三个条件: 除了这些删除的圆环之外,其他圆环还连接着的圆环不能超过两个. 剩下的环没有连成圈. 剩下的圆环共分成m堆,每堆之间无连接,m必须 ...

  7. SpringBoot整合SpringSecurity,SESSION 并发管理,同账号只允许登录一次

    重写了UsernamePasswordAuthenticationFilter,里面继承AbstractAuthenticationProcessingFilter,这个类里面的session认证策略 ...

  8. 两种实现方式mycat多租户,枚举分片,注解拦截

    第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式  /*!mycat:schema=[schemaName] */   注意:这在navicat 里面是会报错的,请用命令行登陆myc ...

  9. python爬虫框架scrapy问题的解决

    2016-09-24:今天的弄了一天的scrapy的环境的配置的,linux很多的学过的事情都忘记啦.理论和实践的结合还是非常的重要的,不光要学会思考,更要学会总结纪录.还要多多回忆的和复习.学习了不 ...

  10. HDP2.0.6+hadoop2.2.0+eclipse(windows和linux下)调试环境搭建

    花了好几天,搭建好windows和linux下连接HDP集群的调试环境,在此记录一下 hadoop2.2.0的版本比hadoop0.x和hadoop1.x结构变化很大,没有eclipse-hadoop ...