Dilimdeki bir öğeyi saymak için bir diziyi önceden işleme


11

Bir dizi doğal sayıların , burada bir sabit olduğunda, formun sorgularına cevap vermek istiyorum : " ve endeksler arasındaki dizide kaç kez görünüyor "?k k O ( 1 ) m i ja1,,ankkO(1)mij

Dizi doğrusal zamanda önceden işlenmelidir. Özellikle Aralık Minimum Sorgusunda bir azalma olup olmadığını bilmek istiyorum.


Bu, ve bir aralıktaki sayıların sayısını sorgulamak istediğinizde RMQ'ya eşdeğerdir . Bu yüzden kullanabilirsiniz bunu . SE'nin sınırları nedeniyle kendi sorumu cevaplayamadım.k=1


Sorununuzun eleman farklılığını azaltabilirsiniz (doğrusal zamanda). Belki bir modelden bahsetmek gerekir mi?
Aryabhata

@Aryabhata tam olarak eleman farklılığı sorunu nedir? Şimdi bunu okuyorum: en.wikipedia.org/wiki/Range_Queries
andy

Bu, RMQ'dan çok daha kolaydır. İpucu: k sabit olduğundan, ön işleme kn ile orantılı zaman harcayabilir ve yine de doğrusal zaman olarak sayılır.
Tsuyoshi Ito

@Aryabhata: Bahsettiğinizi düşündüğüm azalma işe yaramıyor çünkü k bu problemde sabit.
Tsuyoshi Ito

Her halükarda, dizi başlangıçta verilirse ve daha sonra güncellenmezse, daha önce yaptığım yorumda önerdiğim gibi RMQ bir overkill'dir.
Tsuyoshi Ito

Yanıtlar:


4

Yana sabiti olduğu için, aralığı her elemanın sayısı saklayabilir için de olarak zaman ve mekan. Birincil gözlem, bir iki-boyutlu bir dizi olmasına neden olmasıdır olarak zaman, fark bularak daha sonra sorgu aralıkları sabit zaman endeksleri.0 .. m 0 m < n 0 .. n O ( n k ) = O ( n ) O ( n k ) i , jk0..m0m<n0..nO(nk)=O(n)count[pos][elem] = occurences of 'elem' in the indices 0..posO(nk)i,j

Ön İşleme

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

Sorgu

(i, j'nin her ikisinin de dahil olduğu varsayılır)

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

kcountO(logn)O(logn)

Bu cevapla ilgili herhangi bir sorun için özür dilerim, bu benim ilk.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.