C# 特殊类型查询的数据结构

C# 特殊类型查询的数据结构,c#,java,c++,algorithm,data-structures,C#,Java,C++,Algorithm,Data Structures,我曾经遇到过这样的问题。假设我们得到一个由n元素组成的数组A,其中n大约为1百万。我们收到的查询形式为'pq'。在每个查询中,我们必须对A[p]到A[q]的元素执行一些操作 这个操作是一些普通的操作,比如XOR之类的。对于给定数字m的A(从索引p到q)中的每一个数的异或。对于ex-A[p]^m,A[p+1]^m..A[q]^m 如果给我们数千个类型为“pq”的查询,那么我们会对重叠范围进行重复计算(例如-p1对于范围0到log(n)中的每个k,存储长度为n/2**k的数组A[k] [k][i

我曾经遇到过这样的问题。假设我们得到一个由
n
元素组成的数组
A
,其中
n
大约为
1
百万。我们收到的查询形式为
'pq'
。在每个查询中,我们必须对
A[p]
A[q]
的元素执行一些操作

  • 这个操作是一些普通的操作,比如
    XOR
    之类的。对于给定数字m的A(从索引p到q)中的每一个数的异或。对于ex-
    A[p]^m,A[p+1]^m..A[q]^m

如果给我们数千个类型为“pq”的查询,那么我们会对重叠范围进行重复计算(例如-
p1对于范围0到log(n)中的每个k,存储长度为n/2**k的数组A[k]

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

当您想要对某个范围进行操作时,您可以将该范围分成尽可能大的块,并更新[k]中的相应条目

e、 g.如果你的范围是16->33,你只需要更新一个[4][1](代表16->31)和一个[1][16](代表32->33)

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

e、 g.要访问5,您需要将[0][5]和[1][2]中的操作与[2][1]和[3][0]中的操作合并


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

我想到的第一件事是a,但它只在您描述的查询确实是表的更新且不返回结果时才真正适用。因此,将有一个更新[p q]操作和一个查询[p q]。第一个仅使用您描述的操作进行更新,第二个返回范围中的值


当然,有一点要考虑的是空间/时间的权衡。当你谈到数百万个int时,这是一个很好的结果,这对于某些嵌入式系统来说是不可能的,你很可能需要每个代码的结果[A] [P] XOR [P+1 ],[P] XOR [P+3] ……代码> A[Q-1 ] XOR A[Q]
或类似于
A[p]xor A[p+1]xor A[p+2]…A[q]
的聚合?对于后者,有一个相当简单的结构可以做到这一点。@SergeyL.I已更新。请检查。@Avram我已更新。请检查。@user1708762是垃圾标签子页面吗?您认为这样做是正确的吗?