간격 및 쿼리 수 0에 대한 업데이트를위한 데이터 구조


13

n 크기 의 정수 테이블 를 유지하고 시간 에서 다음 작업을 허용 하는 데이터 구조를 찾고 있습니다.tnO(logn)

  • t [ a ] , t [ a + 1 ] , , t [ b ]increase(a,b) 는 시킵니다.t[a],t[a+1],,t[b]
  • decrease(a,b) 는 입니다.t[a],t[a+1],,t[b]
  • support() , 되도록 인덱스 수 를 반환합니다 .t [ i ] 0it[i]0

동일한 매개 변수 로 감소시키기 위해 모든 감소 호출을 이전 호출과 일치시킬 수 있습니다 . 내가 생각하는 응용 프로그램은 주어진 직선 사각형의 n의 합집합 영역을 시간 로 계산하는 스윕 라인 알고리즘 입니다.O ( n log n )a,bO(nlogn)

쿼드 트리의 크기는 이므로 솔루션이 아닙니다. Fenwick 또는 Interval 나무는 올바른 맛을 가지고 있지만 위의 작업을 지원하기 위해 나무를 확장하는 방법을 알지 못합니다.Θ(n2)


Fenwick 트리는 "감소하기위한 모든 호출이 동일한 매개 변수 a, b로 증가하기 위해 이전 호출과 일치 할 수 있습니다"라는 약속을 사용하지 않으므로 해당 약속을 사용하는 더 간단한 해결책이있을 수 있습니다 (그러나 현재는 나에게서 벗어날 수 있습니다).
제레미

입력의 수는 최대 (반복을 감지하고 데이터 구조에 삽입 할 수 없음)이므로 공통 측정 값 트리 데이터 구조를 사용하여 성능을 얻을 수 있습니다. cosy.sbg.ac.at/~ksafdar/data/courses/SeminarADS/… 슬라이드 47-52를 참조하십시오 . O ( 로그 n )n2O(logn)
Chao Xu

제레미와 차오 수 귀하의 의견에 감사드립니다. 인터벌 트리를 사용하여 변화하는 간격 세트의 전체 길이를 유지하는 방법을 이해합니다. 이것은 실제로 매우 귀여운 데이터 구조입니다.
Christoph Dürr

일반적인 데이터 구조 문제의 경우, 시간에서 검색하려면 공간 O ( p ) O ( n 2 )가 필요합니다. 여기서 p 는 활성 좌표 쌍 목록의 크기입니다. 그러나 실제로 스위프 라인 알고리즘log(n2)O(log(n))O(p)O(n2)p 경우 공간은 선형으로 유지됩니다. 문제는 여전히보다 공간 데이터 구조에 대한 개방 O ( P ) 때, PpO(n)O(p) . pω(n)
Jeremy

답변:


2

범위의 재귀 파티션 인 더 작은 범위로 세그먼트 트리를 사용하십시오 . 업데이트 작업의 각 간격 [ a , b ] 은이 재귀 파티션에서 범위의 O ( log n ) 로 분할 될 수 있습니다 . 각 범위 [ x , y ] 저장에 대해 :[1,n][a,b]O(logn)[x,y]

  • 숫자 의 간격 [ , B ] 증가되지 않은되도록 감소 [ X , Y를c(x,y)[a,b] [ a , b ] 가 분할되는 범위 중 하나[x,y][a,b]
  • 숫자 u(x,y)재귀 에서 이하의 분할 된 부분 집합으로 덮여 있지 않은 셀[x,y]

경우 로 재귀 분할 [ X , Z ][ Z + 1은 , ] 우리가 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 ]O ( log n ) 범위 로 분할 하고 이러한 각 범위에 대해 c ( x , y ) 를 증가 시키고 위 공식을 사용하여 u 를 다시 계산하십시오.(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]를 설정합니다. 내 대답의 수식에 따르면이 세 범위의 u [x, y]도 0이됩니다. u [1,2]는 1이되고 u [1,4]는 1이됩니다. 5,8] = 2, u [1,8] = 1 + 2 = 3
David Eppstein

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.