吐槽
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. linux文件权限查看及修改-chmod ------入门的一些常识

    查看Linux文件的权限:ls -l 文件名称查看linux文件夹的权限:ls -ld 文件夹名称(所在目录)修改文件及文件夹权限:sudo chmod -(代表类型)×××(所有者)×××(组用户) ...

  2. ListIterator的使用

    package cn.lonecloud.Iterator; import java.util.ArrayList; import java.util.ListIterator; public cla ...

  3. R学习笔记:了解R的使用

    R是一种区分大小写的解释性语言,只支持单行注释,注释由符号#开头,当前行出现在#之后的任何文本都会被R解释器忽略.R脚本的一次执行叫做一个会话(Session),可以通过函数quit()退出当前的会话 ...

  4. Mysql--Database Exception (#42) 数据库错误

    mysql是phpstudy中的mysql,出现这个错误八成是php.ini中没有设置mysql.sock 使用探针或者phpinfo查看php.ini的位置. sudo find / -name m ...

  5. MySQL的InnoDB引擎与MyISAM引擎

    MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...

  6. TP3.2 中使用 PHPMailer 发送邮件

    第一步.添加PHPMailer类库 http://pan.baidu.com/s/1o7Zc7V0 第二步.添加发送邮件函数 在common目录中的公共函数文件加入函数 <?php /***** ...

  7. 在Angular中利用trackBy来提升性能

    在Angular的模板中遍历一个集合(collection)的时候你会这样写: <ul> <li *ngFor="let item of collection"& ...

  8. Android WebView 保持登录问题

    最近有个需求是这样的:在应用中添加一个商城,商城的实现是H5(包括登录).需要将这个H5嵌到原生应用中,并在原生代码中添加支付功能. 接到这个需求的时候,想这不是很简单么,用WebView加载这个页面 ...

  9. 304和浏览器http缓存

    浏览器虽然发现了本地有该资源的缓存,但是不确定是否是最新的,于是想服务器询问,若服务器认为浏览器的缓存版本还可用,那么便会返回304. 浏览器缓存分为强缓存和协商缓存. 1.浏览器请求某资源,通过he ...

  10. openstack-ocata-身份验证2

    Identity service 一.身份服务概述 OpenStack身份管理服务提供一个单点集成身份验证.授权和目录服务. 身份服务通常是第一个服务用户与之交互.一旦身份验证,最终用户可以使用自己的 ...