二维与高维空间中的范围搜索与最近点计算算法
在计算机科学和计算几何领域,范围搜索和最近点计算是重要的问题。本文将介绍两种不同的算法,一种是基于 Voronoi 图的二维范围搜索算法,另一种是在三维及更高维度中计算查询超平面最近点的算法。
基于 Voronoi 图的二维范围搜索算法
算法步骤
-
点删除与邻点检查
:从集合 $Q$ 中删除一个点 $P_n$,对于 $P_n$ 的每个邻点 $P_{n’}$,若 $A[n’]$ 为
False且 $P_{n’}$ 在查询范围 $R$ 内,则报告 $P_{n’}$ 并将其插入 $Q$,同时将 $A[n’]$ 设为True。
Delete one point Pn from Q.
For each point Pn′ neighbouring to Pn, begin
If A[n′] is False, begin
If Pn′ is inside R, report Pn′ and insert Pn′ into Q.
Set A[n′] True.
end
end
-
重置标记数组
:将数组 $A$ 的所有元素重置为
False。为避免 $O(N)$ 的执行时间,使用另一个存储 $Q’$ 来记录已检查的输入点,只需重置 $Q’$ 中的元素即可。
Step 4 Reset all of the elements A[1], A[2], . . ., A[N] False.
(In order to avoid spending O(N) execution time at this step, we use another storage
Q′ which stores every input point checked so far. Thus, we can reset all the elements
of A False, by just resetting the elements in Q′.)
算法有效性证明
为证明算法能找到查询范围 $R$ 内的所有点,将输入点分为以下几类:
-
Type (I - 1)
:在 $R$ 内且被报告的点。
-
Type (I - 2)
:在 $R$ 内但未被报告的点。
-
Type (O - 1)
:在 $R$ 外且在步骤 2 中被追踪的点。
-
Type (O - 2)
:在 $R$ 外,步骤 2 中未被追踪,但与至少一个步骤 2 中被追踪的点相邻的点。
-
Type (O - 3)
:在 $R$ 外,步骤 2 中未被追踪,且与步骤 2 中任何被追踪的点都不相邻的点。
假设存在 Type (I - 2) 类型的点 $P_m$,则 $P_m$ 仅与 Type (I - 2)、Type (O - 2) 或 Type (O - 3) 类型的点相邻,否则 $P_m$ 会被检查并报告。这会导致存在一个在 $R$ 内、步骤 2 未被追踪但与 $R$ 外且步骤 2 未被追踪的点相邻的点,这与步骤 2 中追踪点的 Voronoi 多边形不能有间隙相矛盾,因此 Type (I - 2) 类型的点不存在。
执行时间估计
当每个 Voronoi 多边形的相邻多边形数量可视为小于某个常数时,执行时间与步骤 2 和步骤 3 中追踪的点数成正比。这些点分为 (I - 1)、Type (O - 1) 和 Type (O - 2) 三种类型。随着输入点密度增大,$R$ 内的点数增长速度远快于 Type (O - 1) 或 Type (O - 2) 类型的输入点数,因此算法中追踪的输入点总数为 $O(K)$,其中 $K$ 是 $R$ 内的点数。除步骤 1 外,执行时间相对于输入点数 $N$ 是常数,这种时间复杂度是最佳的平均情况性能。
数值实验
将该算法(包括点定位)的执行时间与以下三种代表性算法进行比较:
-
Bucket
:使用简单的分桶技术,将输入点分布的整个方形区域划分为小方形单元(桶)。在查询时,先检查每个桶是否与查询范围相交,仅当桶相交时,再检查桶内的输入点是否在查询范围内。通过实验确定参数 $k$ 的合适值为 1.0,此时执行时间最短。
-
k - d Tree (Direct Use)
:使用 k - d 树进行几何搜索。根节点与整个区域和一个输入点相关联,子节点与较小的矩形区域相关联,通过交替的水平或垂直线进行区域划分,划分方向由节点深度的奇偶性决定,划分位置使剩余输入点大致均匀分布。在查询时,递归遍历与查询范围相交的矩形区域对应的叶子节点,检查相关输入点是否在查询范围内。
-
k - d Tree (After Triangulation)
:对查询范围进行三角剖分后使用 k - d 树。对每个三角剖分生成的三角形采用相同的搜索方法,最后报告所有三角形中找到的输入点。
实验使用两种类型的输入点:均匀分布的输入点和聚类的输入点,查询范围的形状限制为正方形、圆形星形 100 边形和锐角星形 100 边形。实验结果表明:
- 所有算法的执行时间与查询范围的面积(即预期报告的点数 $K$)呈线性关系。
- 当查询范围的角度数较小时,基于 Voronoi 图的算法性能最佳。
- 即使查询范围的角度数较大,只要面积较小,基于 Voronoi 图的算法仍表现最佳。
- 当查询范围为锐角(边界长度大)时,三角剖分后使用 k - d 树的算法优于基于 Voronoi 图的算法。
- 当报告的点数足够小时,基于 Voronoi 图的算法在所有测试的查询范围类型中表现最佳。
以下是不同算法在不同情况下的性能对比表格:
| 算法 | 查询范围形状 | 报告点数情况 | 性能表现 |
| — | — | — | — |
| 基于 Voronoi 图 | 角度数小 | 任意 | 最佳 |
| 基于 Voronoi 图 | 角度数大,面积小 | 任意 | 最佳 |
| k - d Tree (After Triangulation) | 锐角,边界长 | 任意 | 优于 Voronoi 图算法 |
| 基于 Voronoi 图 | 报告点数小 | 任意形状 | 最佳 |
三维及更高维度中计算查询超平面最近点的算法
问题背景
在平面中预处理一组 $n$ 个点以确定查询线的最近点的问题已有多种解决方案。本文将问题扩展到三维及更高维度。
三维情况
扩展 [5] 中的技术,得到一个算法,其预处理时间复杂度为 $O(n^{1 + \epsilon})$,空间复杂度为 $O(n \log n)$,查询时间复杂度为 $O(n^{2/3 + \epsilon})$。
更高维度情况($d > 3$)
推广 [4] 的方法,主要思想是在 $d$ 维超平面排列中定位查询点(对应查询超平面)。该点所在单元格的上下边界超平面对应于原平面中的候选最近点。通过在预处理阶段使用 Meiser [6] 的通用点定位算法实现,在一个较强假设下,该算法的查询时间在摊销意义下为 $O(d \log n)$,预处理空间为 $O(n^{d + \kappa})$,预处理时间为 $O(n^{d + 1 + \kappa})$,其中 $\kappa > 0$。
以下是不同维度算法复杂度的总结表格:
| 维度 | 预处理时间 | 空间复杂度 | 查询时间 |
| — | — | — | — |
| $d = 3$ | $O(n^{1 + \epsilon})$ | $O(n \log n)$ | $O(n^{2/3 + \epsilon})$ |
| $d > 3$ | $O(n^{d + 1 + \kappa})$ | $O(n^{d + \kappa})$ | $O(d \log n)$(摊销意义) |
下面是二维范围搜索算法主要步骤的 mermaid 流程图:
graph TD;
A[开始] --> B[从 Q 中删除点 Pn];
B --> C{遍历 Pn 的邻点 Pn'};
C -- 是 --> D{A[n'] 是否为 False};
D -- 是 --> E{Pn' 是否在 R 内};
E -- 是 --> F[报告 Pn' 并插入 Q];
F --> G[将 A[n'] 设为 True];
G --> C;
E -- 否 --> C;
D -- 否 --> C;
C -- 否 --> H[重置 A 数组元素为 False];
H --> I[结束];
综上所述,基于 Voronoi 图的二维范围搜索算法在大多数情况下表现出色,而在三维及更高维度中,针对不同维度采用了不同的算法策略来计算查询超平面的最近点。这些算法在不同场景下各有优劣,可根据具体需求选择合适的算法。
算法应用场景分析
基于 Voronoi 图的二维范围搜索算法应用场景
- 地理信息系统(GIS) :在 GIS 中,经常需要查询某个区域内的地理要素,如城市中的兴趣点(POI)、特定区域内的建筑物等。当查询范围形状较为规则(如正方形)或角度数较少,且报告点数相对较少时,基于 Voronoi 图的算法能快速定位到所需的地理要素,因为其执行时间与查询范围面积呈线性关系,且受输入点数影响较小。
- 计算机图形学 :在图形渲染、碰撞检测等场景中,可能需要确定某个特定区域内的图形元素。例如,在游戏场景中,检测某个圆形或方形区域内的游戏对象。基于 Voronoi 图的算法可以高效地完成此类查询任务,尤其是当查询范围面积较小时,能展现出良好的性能。
三维及更高维度中计算查询超平面最近点算法应用场景
- 三维建模与设计 :在三维建模软件中,可能需要找到距离某个平面最近的点,如在建筑设计中,确定距离某个墙面最近的建筑构件。对于三维情况,扩展 [5] 技术的算法可以在合理的预处理时间和空间复杂度下,快速完成查询任务。在更高维度的设计场景中,如多参数优化设计,推广 [4] 方法的算法可以在一定假设下,高效地找到最近点。
- 机器学习与数据分析 :在高维数据处理中,如特征空间中的数据查询,可能需要找到距离某个超平面最近的数据点。该算法可以帮助在高维数据中进行快速的最近点查询,为数据分析和模型训练提供支持。
算法选择建议
根据不同的应用场景和数据特点,选择合适的算法至关重要。以下是一个简单的决策流程表格:
| 应用场景特点 | 推荐算法 |
| — | — |
| 二维查询,查询范围角度数少,报告点数少 | 基于 Voronoi 图的算法 |
| 二维查询,查询范围角度数多但面积小 | 基于 Voronoi 图的算法 |
| 二维查询,查询范围为锐角且边界长,报告点数多 | k - d Tree (After Triangulation) |
| 三维查询 | 扩展 [5] 技术的算法 |
| 更高维度查询($d > 3$),满足特定假设条件 | 推广 [4] 方法的算法 |
算法优化思路
基于 Voronoi 图的二维范围搜索算法优化
- 并行计算 :可以利用多核处理器或分布式计算平台,并行处理邻点检查和标记数组重置等操作,以进一步减少执行时间。
- 动态更新 :对于动态变化的输入点集,设计动态更新 Voronoi 图的算法,避免每次更新都重新构建整个图。
三维及更高维度中计算查询超平面最近点算法优化
- 降低假设条件的强度 :对推广 [4] 方法的算法进行改进,降低其依赖的强假设条件,使其在更广泛的场景中适用。
- 数据压缩 :在预处理阶段,对高维数据进行压缩,减少预处理空间和时间复杂度。
下面是根据应用场景选择算法的 mermaid 流程图:
graph TD;
A[开始] --> B{是否为二维查询};
B -- 是 --> C{查询范围角度数是否少};
C -- 是 --> D{报告点数是否少};
D -- 是 --> E[选择基于 Voronoi 图的算法];
D -- 否 --> F{查询范围面积是否小};
F -- 是 --> E;
F -- 否 --> G{查询范围是否为锐角且边界长};
G -- 是 --> H[选择 k - d Tree (After Triangulation)];
G -- 否 --> E;
C -- 否 --> F;
B -- 否 --> I{是否为三维查询};
I -- 是 --> J[选择扩展 [5] 技术的算法];
I -- 否 --> K{是否满足特定假设条件};
K -- 是 --> L[选择推广 [4] 方法的算法];
K -- 否 --> M[需进一步研究优化];
总结
本文介绍了基于 Voronoi 图的二维范围搜索算法和三维及更高维度中计算查询超平面最近点的算法。通过对算法步骤、有效性证明、执行时间估计、数值实验的分析,明确了不同算法在不同场景下的性能表现。同时,探讨了算法的应用场景、选择建议和优化思路。在实际应用中,应根据具体的需求和数据特点,选择最合适的算法,并可根据实际情况对算法进行优化,以提高计算效率和性能。
超级会员免费看
3664

被折叠的 条评论
为什么被折叠?



