特殊类型查询的数据结构

时间:2012-10-06 17:12:16

标签: c# java c++ algorithm data-structures

我遇到过这种问题。假设我们被赋予了An个元素的数组,其中n大约为1百万。我们收到'p q'格式的查询。在每个查询中,我们必须对元素A[p]A[q]执行一些操作。

  • 此操作是一些普通操作,如XOR或其他操作。用于给出具有给定数m的A中的每个数字(从索引p到q)的XOR。对于前A[p]^m,A[p+1]^m..A[q]^m

如果给出数千个'p q'类型的查询,那么我们会对重叠范围进行重复计算(例如,对于例如{ - 1}})。如果有空间/时间权衡,我宁愿更快地完成我的工作,即使它需要更多的空间。所以,我把时间都集中在空间上。

我的问题是 - 是否有任何数据结构可以有效地处理这些类型的查询(有一些范围在进一步的查询中重复)。我能想到的是 - 做一些预先做的事情 - 处理和保存数据结构中的东西。然后在我们收到进一步查询时进行更新和处理。

有人可以建议一些数据结构,这有助于处理与某些范围有关的查询(特别是当范围进一步重复时)?

2 个答案:

答案 0 :(得分:1)

我想到的第一件事是Segment Tree with lazy propagation,但只有在你描述的查询真的是对表的更新并且不返回结果时它才真正适用。因此,会有更新[p q]操作和查询[p q]。第一个只使用您描述的操作进行更新,第二个返回范围内的值。

另见this

答案 1 :(得分:0)

对于0到log(n)范围内的每个k,存储长度为n / 2 ** k的数组A [k]。

A [k] [i]的内容将表示数组中从索引i * 2 ** k到(i + 1) 2 * k-1的元素。

当您想要在一个范围内操作时,您可以将范围分解为可能的最大块并更新A [k]中的相应条目。

e.g。如果您的范围是16-> 33,则只更新A [4] [1](代表16-> 31)和A [1] [16](代表32-> 33)

如果要访问元素中的组合值,则需要组合每个log(n)数组中的操作。

e.g。要访问5,您需要在A [0] [5]和A [1] [2]以及A [2] [1]和A [3] [0]等中组合操作。

这应该为范围上的每个操作以及元素的每次访问提供O(log(n))成本。