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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.