スライス内の要素をカウントするための配列の前処理(RMQへの削減?)


11

配列を指定して、1... nは自然数のKkは定数であるが、私は答えにしたいO 1 の形式のクエリは:「何回んmはインデックス間の配列に現れIj "?a1,,ankkO(1)mij

アレイは線形時間で前処理する必要があります。特に、範囲の最小クエリに減少があるかどうかを知りたいです。


これは、で、間隔内の1の数を照会する場合のRMQと同等です。だから私たちはそれを使うことができます。SEの制限のため、自分の質問には答えられませんでした。k=1


(線形時間で)問題の要素の明確性を減らすことができます。たぶんモデルについて話すことは正しいですか?
アリヤバタ2012年

@Aryabhata正確に要素の明確性の問題は何ですか?今私はこれを読んでいます:en.wikipedia.org/wiki/Range_Queries
andy

これはRMQよりもはるかに簡単です。ヒント:kは定数なので、前処理はknに比例して時間を費やすことができ、それでも線形時間としてカウントされます。
伊藤剛

@Aryabhata:この問題ではkは定数なので、あなたが話していると思う削減は機能しません。
伊藤剛

念のため、配列が最初に指定され、後で更新されない場合、以前のコメントで提案したように、RMQは過剰です。
伊藤剛

回答:


4

k0..m0m<n0..nO(nk)=O(n)count[pos][elem] = occurences of 'elem' in the indices 0..posO(nk)i,j

前処理

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]

kcountO(logn)O(logn)

この回答の問題についてお詫び申し上げます。これが初めてです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.