用于间隔更新和查询零数的数据结构


13

我正在寻找一种数据结构,该结构将维护大小为n的整数表,并允许在时间O log n )中进行以下操作。tnO(logn)

  • ,这增加了[ 一个] [ 一个+ 1 ] ... [ b ]increase(a,b)t[a],t[a+1],,t[b]
  • ,从而减少 t [ a ] t [ a + 1 ] t [ b ]decrease(a,b)t[a],t[a+1],,t[b]
  • ,它返回索引 i的数量,以使 t [ i ] 0support()it[i]0

您可以保证,使用相同的参数可以将每次减少请求与上一次增加请求进行匹配。我想到的应用程序是一种扫掠线算法,可以在时间O n log n )中计算n个给定直线矩形的并集面积。a,bO(nlogn)

四叉树的大小为,所以这不是解决方案。Fenwick或Interval树具有适当的风格,但我看不出如何扩展它们以支持上述操作。Θ(n2)


Fenwick树不会使用“可以使用相同的参数a,b将每个减少请求与先前的增加请求进行匹配”的承诺,因此使用该承诺可能会有一个更简单的解决方案(但现在我不知道了)。
杰里米

由于您可以拥有的输入数量最多为(您可以检测到重复并且可以不插入到数据结构中),因此,使用通用的度量树数据结构,我们仍然可以获得O log n 性能。参见cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/…幻灯片47-52。n2O(logn)
徐超

杰里米(Jérémie)和朝旭(Chao Xu)。感谢您的评论。我现在了解如何使用“间隔树”来维护一组不断变化的间隔的并集的总长度。实际上,这是一个非常可爱的数据结构。
ChristophDürr2013年

对于一般数据结构的问题,在搜索时,需要空间ø p Ô Ñ 2其中,p是有源对坐标的列表的大小。但确实是扫掠迹线算法p Ø ñ 这样的空间保持在线。当p大于O p )时,对于空间更好的数据结构,问题仍然存在。log(n2)O(log(n))O(p)O(n2)ppO(n)O(p)pω(n)
杰里米

2
这是一个很好的链接,您可以在其中测试针对相同问题的其他解决方案的实现:spoj.com/OI/problems/NKMARS
Segal-Halevi

Answers:


2

使用段树-将范围递归划分为较小的范围。更新操作的每个间隔[ a b ]可以划分为该递归分区中范围的O log n 。对于每个范围[ x y ]存储:[1,n][a,b]O(logn)[x,y]

  • 间隔[ a b ]的数量已增加但未减少,以使[ x y ][ a b ]划分的范围之一c(x,y)[a,b][x,y][a,b]
  • 递归[ x y ]或更低的区间的分区子集未覆盖的单元数u(x,y)[x,y]

然后,如果递归拆分为[ x z ][ z + 1 w ],则 u x y = { 0 如果  c x y > 0 u x z + u z + 1 y 否则[x,y][x,z][z+1,w]

u(x,y)={0if c(x,y)>0u(x,z)+u(z+1,y)otherwise
因此当范围的其他数据发生变化时我们可以在恒定时间内更新每个值。可以通过查看u 1 n 来回答每个支持查询。u(x,y)u(1,n)

(a,b)[a,b]O(logn)c(x,y)u(x,y)


[x,y][x,y][x,y]u(x,y)=0

[x,y][x,y][x,y]

你能举个例子吗?
jbapple

假设您的间隔是数字[1,8]。将其递归分为[1,4],[4,8],然后是[1,2],[3,4],[5,6]和[7,8],然后是所有一个元素范围。最初,所有内容均未被发现,所有c [x,y] = 0,并且每个范围的长度都为u =其长度。但是,假设您执行了一个递增[2,6]操作。可将[2,6]分解为的O(log n)最大范围为[2,2],[3,4]和[5,6],因此我们为这三个设置c [x,y]范围为1。根据我的答案公式,这将导致这三个范围的u [x,y]也变为0。u [1,2]变为1,u [1,4]也变为1,u [ 5,8] = 2,而u [1,8] = 1 + 2 = 3
David Eppstein

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.