中文

实践中如何处理小批量 RMQ 或 LCA 查询

数据结构与算法 2017-05-15 v1

摘要

在区间最小查询(RMQ)问题中,给定一个包含 nn 个数字的数组 AA,要求回答以下类型的查询:对于介于 00n1n-1 之间的索引 iijj,查询 RMQA(i,j)\text{RMQ}_A(i,j) 返回子数组 A[i..j]A[i..j] 中最小元素的索引。处理小批量 RMQ 是许多实际应用中的核心计算任务,特别是由于其与最低公共祖先(LCA)问题的关联。小批量是指查询的数量 qqo(n)o(n) 且我们一次性拥有所有查询。因此,构建大小为 Ω(n)\Omega(n) 的数据结构或花费 Ω(n)\Omega(n) 时间构建更简洁的数据结构并不合适。在从业者及其他领域中众所周知,这些用于在线查询的数据结构在预处理和查询时间中包含较高的常数项。因此,我们希望在实践中高效地处理这批查询。在实践中高效是指我们(最终)希望花费 n+O(q)n + \mathcal{O}(q) 的时间和 O(q)\mathcal{O}(q) 的空间。我们写 nn 是为了强调 AA 的每个条目上的操作次数应该是一个非常小的常数。在此我们展示了如何轻松修改现有算法以满足这些条件。所呈现的实验结果突出了该新方案的实用性。获得的最显著改进在于处理小批量 LCA 查询。本文所呈现算法的库实现已公开提供。

关键词

引用

@article{arxiv.1705.04589,
  title  = {How to answer a small batch of RMQs or LCA queries in practice},
  author = {Mai Alzamel and Panagiotis Charalampopoulos and Costas S. Iliopoulos and Solon P. Pissis},
  journal= {arXiv preprint arXiv:1705.04589},
  year   = {2017}
}

备注

Accepted to IWOCA 2017