# 1. 问题定义:什么是 Planar Point Location?

  • 目标:给定一个平面细分(由线段将平面划分成多个不重叠区域),我们希望预处理它,使得对于任意查询点 qq,可以快速判断它位于哪个区域(face)中。
  • 输入:包含 nn 条边的平面细分 SS
  • 查询:给定一个点 qq,返回包含它的面。

# 2. 第一种方法:暴力线性扫描

  • 思路:遍历所有面,检查查询点 qq 是否落在其中。
  • 做法
    • 对每个面进行点在多边形内的判断(如射线法或环绕数方法)。
  • 时间复杂度
    • 每个面 O(k)O(k),总共 O(n)O(n)
  • 空间复杂度O(n)O(n)

优点

  • 简单、容易实现。

缺点

  • 查询慢,不能满足高效多次查询的需求。

# 3. 第二种方法:垂直切分法(Vertical Slab Decomposition)

# 3.1 基本思想

  • 在每个顶点处画一条垂直线,将平面划分成多个 “垂直条形区”(slabs)。
  • 每个 slab 包含按 y 坐标排序的一组线段。

# 3.2 查询过程

  1. 查找包含查询点的 slab
    • 用二分查找 slab 的左右边界(即垂直线的 x 坐标)。
    • 时间:O(logn)O(\log n)
  2. 在 slab 中查找线段上下位置
    • slab 中线段按 y 排序,可再用二分查找判断所在的 trapezoid。
    • 时间:O(logn)O(\log n)

# 3.3 时间与空间复杂度

  • 查询时间O(logn)O(\log n)
  • 空间复杂度
    • 最坏情况:Ω(n2)\Omega(n^2),因为 slab 数和每个 slab 中的线段数最多都可能是 O(n)O(n)

优点

  • 查询效率非常高。

缺点

  • 空间消耗大,不适合大规模数据。

# 4. 方法对比小结

方法查询时间空间复杂度
暴力扫描O(n)O(n)O(n)O(n)
垂直切分法O(logn)O(\log n)O(n2)O(n^2)

# 5. 第三种方法:梯形分解与随机增量构建(Randomized Incremental Construction, RIC)

# 5.1 核心思想

  • 对原始的细分 SS 进行梯形分解(trapezoidal map),将平面划分为一系列梯形或三角形区域。
  • 使用随机插入线段的方式构建搜索结构(有向无环图 DAG),支持快速定位。

# 5.2 梯形分解基本性质

  • 每个面是一个梯形或三角形:有一到两个垂直边,两个非垂直边。
  • 总的面数、顶点数和边数的数量级都是 O(n)O(n)
    • 顶点数 6n+4\leq 6n + 4
    • 面数 3n+1\leq 3n + 1

# 5.3 搜索结构 DAG 的构建

  • 内部节点:
    • xx-node:表示一个端点(用于比较 xx 坐标)
    • yy-node:表示一条线段(用于比较是否在上 / 下方)
  • 叶节点:表示一个梯形区域
  • 插入第 ii 条线段 sis_i 的过程:
    1. 找到所有被 sis_i 穿过的梯形区域
    2. 将这些区域删除,生成新的梯形面
    3. 更新 DAG,将相关叶子节点替换为新结构

# 5.4 正确性保证

  • 使用归纳不变式:每一步插入后,结构保持合法
  • 插入 sis_i 时,只有与其相交的梯形区域会被修改

# 5.5 查询与复杂度

  • 查询时间(期望)O(logn)O(\log n)
  • 空间复杂度(期望)O(n)O(n)
  • 预处理时间(期望)O(nlogn)O(n \log n)

# 6. 期望复杂度分析(Expected Complexity via Backward Analysis)

# 6.1 查询时间的期望分析

  • 查询结构是一棵 DAG,查询一条路径对应从根到某个叶子(梯形)。
  • 查询路径的期望长度等于所有插入步骤中该查询点所经过的节点总和。

设:

  • XiX_i 表示第 ii 次插入时对查询路径的影响(最多新增 3 个节点);
  • PiP_i 表示第 ii 次插入使得查询路径发生变化的概率。

结论:

  • E[Xi]3Pi\mathbb{E}[X_i] \leq 3 \cdot P_i
  • 只有当插入线段 sis_i 改变了包含查询点 qq 的梯形 dq(Si1)d_q(S_{i-1}) 时,路径才会变。

用反向分析估计 PiP_i

  • Pi=Pr[dq(Si)dq(Si1)]4/iP_i = \Pr[d_q(S_i) \neq d_q(S_{i-1})] \leq 4/i
    • 因为最多四个边界(上、下、左、右)会受影响,每一个有 1/i1/i 的概率由 sis_i 决定。

于是:

E[查询路径长度]=i=1nE[Xi]i=1n34i=12Hn=O(logn)\mathbb{E}[\text{查询路径长度}] = \sum_{i=1}^n \mathbb{E}[X_i] \leq \sum_{i=1}^n 3 \cdot \frac{4}{i} = 12 \cdot H_n = O(\log n)

其中 HnH_n 是调和数,Hn<lnn+1H_n < \ln n + 1


# 6.2 空间复杂度的期望分析

  • 每一次插入会创建若干新梯形(即新叶子节点),我们用 kik_i 表示第 ii 次插入新增的梯形数。

反向分析估计 E[ki]\mathbb{E}[k_i]

  • 一个梯形在插入 sis_i 时被删除,当 sis_i 是它的上下边界或左右边界。
  • 一个梯形最多被 4 条线段影响 ⇒ 对每条线段的贡献期望为常数。

因此每轮插入的新增梯形数的期望是:

E[ki]=O(1)\mathbb{E}[k_i] = O(1)

总空间大小期望为:

O(n)+i=1nE[ki]=O(n)O(n) + \sum_{i=1}^n \mathbb{E}[k_i] = O(n)


# 6.3 构建时间复杂度(期望)

每次插入:

  • 查询需要 O(logi)O(\log i) 时间
  • 创建新结构 O(1)O(1)

总期望构建时间为:

i=1n(O(logi)+O(1))=O(nlogn)\sum_{i=1}^n (O(\log i) + O(1)) = O(n \log n)


# 7. 改进与尾部概率界(Refinement & Tail Bounds)

虽然期望查询时间是 O(logn)O(\log n),但我们还可以分析:

一条查询路径超过某个长度的概率有多小?

  • 更进一步的分析显示:
    对于常数 c>0c > 0
    查询路径长度超过 3cln(n+1)3c \ln(n+1) 的概率最多是:

2(n+1)cln1.253(极小的概率)\frac{2}{(n+1)^{c \ln 1.25 - 3}} \quad \text{(极小的概率)}

这说明查询路径长度的分布非常集中,非常可靠地接近对数级别


# 8. 历史方法比较(Point Location Algorithms History)

方法查询时间空间复杂度备注
Edelsbrunner et al. (1986)O(logn)O(\log n)O(n)O(n)使用 segment trees 和 fractional cascading
Kirkpatrick (1983)O(logn)O(\log n)O(n)O(n)基于逐步细化的三角剖分
Sarnak & Tarjan (1986)O(logn)O(\log n)O(n)O(n)基于 persistent search trees
Mulmuley, Seidel (1990-91)O(logn)O(\log n)O(n)O(n)本节课讲的随机增量法(RIC)

# 9. 拓展:三维点定位问题(Open Problem)

问题:是否存在 O(n)O(n) 空间、O(logn)O(\log n) 查询时间的三维点定位结构?

  • 已知结果:
    • Snoeyink (1997):空间 O(nlogn)O(n \log n),查询时间 O(log2n)O(\log^2 n)
  • 当前仍为公开难题(Open Problem 13)

# 10. 总结:平面点定位结构的目标达成

性能指标本节方法(RIC)结果
预处理时间O(nlogn)O(n \log n)(期望)
查询时间O(logn)O(\log n)(期望)
空间复杂度O(n)O(n)(期望)
实用性简单、稳定、快速

RIC 是实用性和效率都很优秀的方法,在理论和实际中广泛应用。