【笔记】Fractional Cascading, Range Tree, Kirkpatrick's Point Location Data Structure
主要是读论文《2D Fractional Cascading on Axis-aligned Planar Subdivisions》时顺便学或看看的东西,写在这里
分散层叠算法(Fractional Cascading)[1] [2] [3]
先考虑一个问题:
Problem 1. 给定k个长为n的序列,q次询问,每次求出每个序列中x的后继,要求强制在线。
对于该问题,我们显然有O(qklogn)的简单做法。此外,我们还可以将k个序列归并成长nk的序列,对每个元素记录其在k个数列中的后继,做到单次O(k+lognk),但是空间复杂度是O(nk2)。
对于FC算法,可以做到单次O(logn+k),空间O(nk)。算法简述如下:
记k个序列依次为 L1,L2,...,Lk,构造k个序列 M1,M2,...,Mk,构造方式为:
- M1=L1;
- Mi(i>1)由Mi−1所有偶数位的元素和Li归并得到,同时记录其中每个元素在Li和Mi−1中的后继的下标,这显然是能够顺带维护的。
接下来对于单次查询,只需先在Mk中二分即可,接下来只需不断O(1)地调用对应元素在上一个数列中的后继,并使用常数(此处不超过1)时间寻找准确的后继即可。
对于该算法,我们还可以有一些小思考:
我们考虑时间复杂度的计算方式,归纳可知Mi的大小不超过2n。类比该式子我们很容易得到DAG上的推广的解决方式:
Problem 2. 给定一个DAG,其中每个节点都对应一个长为n的序列,q次询问,每次求出长为k的一条链上每个序列中x的后继,要求强制在线。
对于该问题,我们可以发现问题1就是其特殊情况。一种做法是,对于每个顶点,假设其入度为d,则各取其前面节点的M的1/2d 与当前节点的L归并,归纳知线性空间,且单次是O(logn+kD),其中D是一个与链上各点的入度有关的常数。
我们不难发现,我们主要利用的是一种类似于误差或扰动的方法来处理这个问题。问题1的解法中,这个扰动就是1。我们不妨考虑增大这个扰动值,假设扰动阈值为p,那么我们只需从序列中取其1/p加入归并即可,而在查询时O(logp)地消除这个扰动。求解不等式得此时空间复杂度依然是O(nk),而预处理的复杂度是O(nk/p),单次时间复杂度是O(logn+klogp)。这可能暗示了FC无法做到某些推广(?
此外,还可以通过分散层叠和线段树将带二分的分块优化掉一个log或者优化成loglog,但在算法竞赛中由于常数原因可能不太实用。
我们可以看出,这个算法的名字的形象表达“分散层叠”,就是将分散的信息进行了“阶级式渗透”。
Range Search, 区域树(Range Tree)[4] [5] [6]
Problem 1(Range Search). 给定平面上大小为n的点集,每次查询一个矩形区域Q,回答该区域内所有点。容易得到该问题的高维推广:
Problem 1(d-Dimension Range Search). 给定d为空间上大小为n的点集,每次查询一个polygon Q,回答Q内所有点。
对于一维的问题,我们显然可以通过建立一个线段树,做到O(n)空间、单次询问O(logn)。而对于二维情况,一种算法竞赛中的常用做法是对x坐标分块,块内对y坐标排序,做到O(n)空间,O(nlogn)预处理,单次 。这里,我们可以用区域树range tree解决,做到空间复杂度是O(nlogn),单次时间复杂度是O(log2n)。具体做法为,以x坐标构造线段树,对于每个节点代表的子区段内的节点,构造一颗以y坐标的线段树,回答询问的做法显然。构造方式为,自顶向下以x分治,自底向上以y归并,易知时间复杂度O(nlogn)。
值得一提的是,我们可以利用fractional cascading优化掉一个log,从而达到优秀的O(nlogn),做法即在y区域树上加入一些辅助指针。
此外,我们很容易能将range tree推广到d维的情况,此时对应的复杂度将会是O(logd−1n)(若使用FC优化则可以做到O(logd−2n)),这比K-d Tree会优秀的多。
Kirkpatrick's Point Location Data Structure [7] [8]
对于平面点定位问题(Planar Point Location),这里介绍一个做法(还有一个做法是利用Slabs的Path/Node-Copying,反正见链接叭)
该算法用于解决对于平面上的简单多边形划分进行Point Location询问,能做到O(n)的空间,O(nlogn)的预处理,单次O(logn)的复杂度,其中n为划分中的点集大小。原理是对原划分构造层级结构(分层图),每个层间具有交叠和相同部分的三角形划分,查询时从根节点开始,逐步根据层间划分的关系定位查询点的所属的面。
算法本身不难理解:首先对原图进行三角形划分,同时标识每个三角形所属的面。之后不断从当前的划分中选取一个最大点独立集,并删去之,当前的划分会出现一些新的多边形面片(holes),然后对新的多边形面片重新三角化并求出其与原三角形的交叠关系,容易知道,一次处理后总点数减少量是与点独立集大小同阶的,而又可以证明一个极大平面图的最大点独立集与其点数是同阶的,故只需进行logn次操作即可,即得到的分层图的层数是logn。具体实现见参考文献
P. Afshani, L. Arge, and K. G. Larsen. Higher-dimensional orthogonal range reporting and rectangle stabbing in the pointer machine model. In Proceedings of the twenty-eighth annual Symposium on Computational Geometry, pages 323-332, 2012. ↩︎
蒋明润.浅谈利用分散层叠算法对经典分块问题的优化.NOI国家集训队论文集.2020. ↩︎
DPair.分散层叠算法学习笔记. https://dpair.gitee.io/articles/fc/ .2020. ↩︎
Stony Brook Algorithm Repository.https://algorist.com/problems/Range_Search.html. ↩︎
https://www.cse.wustl.edu/~taoju/cse546/lectures/Lecture21_rangequery_2d.pdf. ↩︎
未知.范围搜索(Range Query).https://blog.csdn.net/liuqiyao_01/article/details/8478719. ↩︎
Planar Point LocationKirkpatrick's Point Location Data Structure[DB].http://cgm.cs.mcgill.ca/~athens/cs507/Projects/2002/PaulSandulescu/. ↩︎
卜海亮,董力赓,杨之光.基于 Kirkpatrick 结构的点定位算法实现[R]. http://dsa.cs.tsinghua.edu.cn/~deng/cg/project/2003f/2003f-e.pdf. ↩︎
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步