슬라이스의 요소를 계산하기 위해 배열을 사전 처리합니다 (RMQ?로 줄입니까?).


11

배열을 지정해 자연수 K , k는 상수이고, 난에 응답 할 O ( 1 ) 형태의 질의는 "횟수 않는다 m은 인덱스 간의 배열에 나타나는 Ij "?a1,,ankkO(1)mij

어레이는 선형 시간으로 사전 처리되어야합니다. 특히 범위 최소 쿼리가 줄어든 지 알고 싶습니다.


경우 간격 내의 숫자 수를 쿼리하려는 경우 RMQ와 같습니다 . 그래서 우리는 그것을 사용할 수 있습니다 . SE의 한계 때문에 내 자신의 질문에 대답 할 수 없었습니다.케이=1


문제의 요소 별성을 선형 시간으로 줄일 수 있습니다. 아마도 모델에 대해 이야기하는 것이 순서가 맞습니까?
Aryabhata

@Aryabhata 정확히 요소 구별 문제는 무엇입니까? 지금 나는 이것을 읽고 있습니다 : en.wikipedia.org/wiki/Range_Queries
andy

이것은 RMQ보다 훨씬 쉽습니다. 힌트 : k는 상수이므로 전처리는 kn에 비례하여 시간을 소비 할 수 있으며 여전히 선형 시간으로 계산됩니다.
이토 쓰요시

@ Aryabhata : k 가이 문제에서 상수이기 때문에 당신이 이야기하는 감소가 작동하지 않습니다.
이토 쓰요시

배열이 처음에 주어지고 이후에 업데이트되지 않으면 RMQ는 이전 의견에서 제안한 것처럼 과잉입니다.
이토 쓰요시

답변:


4

이후 상수이고, 우리는 범위의 각 요소의 카운트를 저장할 수있다 .. 0 m0 m < N0 .. N 에서 O ( N K ) = O ( N ) 시간과 공간. 주요 관찰은 O ( n k ) 시간 에 2 차원 배열 을 만든 다음 일정한 시간 에 i , j 인덱스 의 차이를 찾아 범위를 쿼리하는 것 입니다.케이0 ..미디엄0미디엄<0 ..영형(케이)=영형()count[pos][elem] = occurences of 'elem' in the indices 0..pos영형(케이)나는,제이

전처리

initialise count[pos][elem] to 0 for all elem, pos
for pos=0 to n
  for num=0 to k
      count[pos][num] = (0 if pos==0 else count[pos-1][num])
  count[pos][arr[pos]] ++

질문

(i, j가 모두 포함 범위라고 가정)

if i == 0
  return count[j][m]
else
  return count[j][m] - count[i-1][m]

케이count영형(로그)영형(로그)

이 답변과 관련된 문제에 대한 사과, 그것은 나의 첫 번째입니다.

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