Preelaborare un array per il conteggio di un elemento in una sezione (riduzione a RMQ?)


11

Dato un array di numeri naturali k , dove k è una costante, voglio rispondere in O ( 1 ) query del modulo: "quante volte m appare nell'array tra gli indici i e j "?a1,,ankkO(1)mij

L'array deve essere preelaborato in tempo lineare. In particolare, vorrei sapere se esiste una riduzione per l'intervallo minimo di query.


Ciò equivale a RMQ nel caso in cui e si desidera interrogare il numero di quelli in un intervallo. Così possiamo usare esso . Non ho potuto rispondere alla mia domanda a causa dei limiti di SE.k=1


Puoi ridurre la distinzione tra elementi e il tuo problema (in tempo lineare). Forse parlare di un modello è in ordine?
Aryabhata,

@Aryabhata qual è esattamente il problema della distinzione tra elementi? Ora sto leggendo questo: en.wikipedia.org/wiki/Range_Queries
andy

Questo è molto più semplice di RMQ. Suggerimento: poiché k è una costante, la preelaborazione può trascorrere un tempo proporzionale a kn e conta comunque come tempo lineare.
Tsuyoshi Ito,

@Aryabhata: la riduzione di cui penso tu stia parlando non funziona perché k è una costante in questo problema.
Tsuyoshi Ito,

Per ogni evenienza, se l'array viene fornito all'inizio e non viene aggiornato in seguito, RMQ è eccessivo, come ho suggerito nel mio commento precedente.
Tsuyoshi Ito,

Risposte:


4

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

Pre-elaborazione

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

domanda

(presuppone che i, j siano entrambi limiti inclusivi)

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

kcountO(logn)O(logn)

Mi scuso per eventuali problemi con questa risposta, è il mio primo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.