吐槽
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. 【技术干货】git常用命令

    2.1 git init语法: git init在当前目录初始化git仓库,适用于尚未使用git管理的项目2.2 git clone语法: git clone <url>例如: git c ...

  2. Linux 安装配置 FTP 服务 (vsftpd)

    1. 安装 vsftpd yum install vsftpd -y 2. 创建用户 record adduser -s /bin/nologin -d /var/RecordFile/ record ...

  3. css命名整理

    .container { width: 720px; background: #fafafa; border: 2px dashed #999; padding: 10px; float: left ...

  4. Taurus.MVC 2.2.3.4 :WebAPI 实现权限控制认证(及功能增强说明)

    前言: 前两天,当我还在老家收拾行旅,准备回广州,为IT连的创业再战365天时, 有网友扣上问:Taurus.MVC中如何实现认证和权限控制,最好能做个小例子. 我一不小心回了句:等回广州我再写篇文章 ...

  5. 《设计模式之禅》--MVC框架

    需求:设计一个MVC框架 (以下可能摘要不全,后期整理) 架构图: * 核心控制器:MVC框架入口,负责接收和反馈HTTP请求 * 过滤器:Servlet容器内的过滤器,实现对数据的过滤处理 * 拦截 ...

  6. UVA - 242 线性DP

    题意:给定多种邮票的组合,邮票最多只能用S张,这些邮票能组成许多不同面额,问最大连续面额的长度是多少,如果有多个组合输出组合中邮票数量最少的,如果仍有长度一致的,输出邮票从大到小排序后字典序最大的那个 ...

  7. UVA - 11624 多点bfs [kuangbin带你飞]专题一

    题意:某人身陷火场,总有k个点着火,着火点可向四周扩散,问此人能否逃离. 思路:可能有多个着火点,以这些着火点作为起点进行bfs,得到整个火场的最短距离,然后又以人所在坐标作为起点进行bfs,得到该人 ...

  8. JSP的内置对象以及作用域。

    最近在面试,一些基础的问题总是会被问到,虽然是基础,但是有些东西在工作中用的少,所以就有些记不清了,在面试的时候更因为紧张很容易造成原先知道的知识也会突然忘了的情况发生.所以在重新组织一下jsp的内置 ...

  9. Zookeeper笔记3——原理及其安装使用

    Zookeeper到底能干什么? 1.配置管理:这个好理解.分布式系统都有好多机器,Zookeeper提供了这样的一种服务:一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣 ...

  10. SRE之道:创造软件系统来维护系统运行

    引言:本文作者Ben Treynor Sloss,Google 运维团队的高级副总裁,SRE 名称的发明者,在这里提供了他对SRE 的定义.  本文选自<SRE:Google运维解密>. ...