Prétraiter un tableau pour compter un élément dans une tranche (réduction en RMQ?)

11

Étant donné un tableau de nombres naturels k , où k est une constante, je veux répondre dans les requêtes O ( 1 ) de la forme: «combien de fois m apparaît-il dans le tableau entre les indices i et j "?a1,,ankkO(1)mij

Le tableau doit être prétraité en temps linéaire. En particulier, j'aimerais savoir s'il y a une réduction de l'intervalle minimum de requête.


Cela équivaut à RMQ dans le cas où et que vous souhaitez interroger le nombre de uns dans un intervalle. Nous pouvons donc utiliser ce . Je n'ai pas pu répondre à ma propre question à cause des limites de SE.k=1

Andy
la source
Vous pouvez réduire la distinction des éléments à votre problème (en temps linéaire). Peut-être que parler d'un modèle est de mise?
Aryabhata
@Aryabhata quel est exactement le problème de distinction des éléments? Maintenant je lis ceci: en.wikipedia.org/wiki/Range_Queries
andy
C'est beaucoup plus facile que RMQ. Astuce: Parce que k est une constante, le prétraitement peut passer du temps proportionnel à kn et il compte toujours comme du temps linéaire.
Tsuyoshi Ito
@Aryabhata: La réduction dont je pense que vous parlez ne fonctionne pas car k est une constante dans ce problème.
Tsuyoshi Ito
Juste au cas où, si le tableau est donné au début et n'est pas mis à jour par la suite, RMQ est une exagération, comme je l'ai suggéré dans mon commentaire précédent.
Tsuyoshi Ito

Réponses:

4

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

Prétraitement

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

Requete

(suppose que i, j sont des bornes inclusives)

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

kcountO(logn)O(logn)

Toutes mes excuses pour tout problème avec cette réponse, c'est ma première.

Goldy
la source