吐槽
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. Python报错:IndentationError: expected an indented block

    sum = 0 for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]: sum = sum + x print(sum) 代码如上,但是运行报错: 发现是因为少了缩进,改正 ...

  2. 分享:Python中的位运算符

    按位运算符是把数字看作二进制来进行计算的.用的不太多,简单了解. 下表中变量 a 为 60,b 为 13二进制格式如下: a = 0011 1100 b = 0000 1101 a&b = 0 ...

  3. WinForm中ClickOnce发布至广域网

    ClickOnce智能客户端,是微软提供比较早的一项技术,用于实现WinForm开发的应用程序能够自动更新,省去给每台客户端升级带来的困扰. 从网上的贴子里看,有的说好用,有的说不好用.客观的说,微软 ...

  4. 数据库中字段类型对应的C#中的数据类型(转载)

    数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] ...

  5. 用batch调用DB2 CLPPlus执行多个SQL文

    不啰嗦直接上技能. 大概三部分组成: 1.bat文件.(run.bat) 2.辅助SQL文.(AllRun.sql) 3.要执行的SQL文.(S1.sql,S2.sql,S3.sql) +++++++ ...

  6. PHP页面间的参数传递

    我们定义page01.php和page02.php两个php文件,将page01中的内容想办法传递到page02,然后供我们继续使用.--------------------------------- ...

  7. python开发concurent.furtrue模块:concurent.furtrue的多进程与多线程&协程

    一,concurent.furtrue进程池和线程池 1.1 concurent.furtrue 开启进程,多进程&线程,多线程 # concurrent.futures创建并行的任务 # 进 ...

  8. MyCat 枚举分片设计思考,查询命中条件

    Mycat多租户实现的两种方式 MyCat,各种分片规则,仅保证插入的时候分片.表关联,join,查询怎么命中分片条件,还是需要设计. 今天稍微测了一下. ER 分片,此方式,插入的时候能分片,但是查 ...

  9. scrapy安装的问题

    Found existing installation: six 1.4.1 DEPRECATION: Uninstalling a distutils installed project (six) ...

  10. Docker系列三:Docker容器管理

    Docker容器管理 1. 单一容器管理 1) 容器的启动 $ docker run --name gitlab-redis -d --volume /srv/docker/gitlab/redis: ...