Memproses ulang array untuk menghitung elemen dalam slice (reduksi menjadi RMQ?)

11

Mengingat array bilangan k , di mana k adalah konstanta, saya ingin jawaban dalam O ( 1 ) query dalam bentuk: "berapa kali m muncul dalam array antara indeks i dan j "?a1,,ankkO(1)mij

Array harus preprocessed dalam waktu linier. Khususnya saya ingin tahu apakah ada pengurangan ke Range Minimum Query.


Ini sama dengan RMQ dalam kasus di mana dan Anda ingin menanyakan jumlah yang dalam interval. Jadi kita bisa menggunakan itu . Saya tidak bisa menjawab pertanyaan saya sendiri karena keterbatasan SE.k=1

andy
sumber
Anda dapat mengurangi perbedaan elemen pada masalah Anda (dalam waktu linier). Mungkin berbicara tentang model sudah beres?
Aryabhata
@Aryabhata apa sebenarnya masalah perbedaan elemen? Sekarang saya membaca ini: en.wikipedia.org/wiki/Range_Queries
andy
Ini jauh lebih mudah daripada RMQ. Petunjuk: Karena k adalah konstanta, preprocessing dapat menghabiskan waktu secara proporsional dengan kn dan masih dihitung sebagai waktu linier.
Tsuyoshi Ito
@Aryabhata: Pengurangan yang saya pikir Anda bicarakan tidak bekerja karena k adalah konstanta dalam masalah ini.
Tsuyoshi Ito
Untuk jaga-jaga, jika array diberikan di awal dan tidak diperbarui sesudahnya, RMQ adalah berlebihan, seperti yang saya sarankan dalam komentar saya sebelumnya.
Tsuyoshi Ito

Jawaban:

4

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

Preprocessing

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]] ++

Pertanyaan

(menganggap saya, keduanya adalah batas inklusif)

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

kcountO(logn)O(logn)

Permintaan maaf untuk masalah apa pun dengan jawaban ini, ini adalah yang pertama.

Goldy
sumber