Considérez le problème suivant:
Soit une constante. On nous donne un tableau -ary de et . Soit .
Nous voulons créer une structure de données en prétraitant pour effectuer le type d'opérations de requête suivant:
- Étant donné les coordonnées d'une case -ary , y a-t-il un dans la case?
- Étant donné les coordonnées d'une case -ary , retournez la position d'un dans la case (s'il y en a une).
Les opérations doivent être effectuées en temps constant . La complexité temporelle est mesurée sur une machine RAM. Le temps et l'espace de prétraitement pour la structure des données ne sont pas importants pour nous.
La question est de combien d'espace (en complexité de bits) avons-nous besoin pour stocker une infrastructure de données permettant les opérations ci-dessus?
La borne inférieure triviale est bits car le tableau peut être reconstruit pour ces requêtes (la structure de données doit donc contenir au moins la même quantité d'informations).
La limite supérieure triviale consiste à stocker la réponse à toutes les requêtes. Cela nécessiterait bits. Cependant, nous pensons que cela peut être fait beaucoup plus efficacement.
Par exemple, considérons le cas spécial où . Dans ce cas, nous pouvons utiliser une structure de données RMQ succincte pour résoudre le premier problème, et la structure de données prend bits à stocker.
Qu'est-ce qu'une structure de données efficace pour cette tâche?
Jusqu'à quel point la complexité de l'espace (le nombre de bits) peut-elle aller pour supporter ces opérations (ou tout simplement la première opération)?
Mise à jour (1/15): Dans le cas spécial , l'utilisation de bits est suffisante (en fait mieux, , où est le nombre de dans ) en réduisant le problème à un problème prédécesseur et en utilisant la réduction du problème prédécesseur au dictionnaire entièrement indexable (FID). Voir « Plus de hâte, moins de déchets: réduire la redondance dans les dictionnaires entièrement indexables » de Grossi, Orlandi, Raman et Rao (2009).
Mise à jour (6/27): Réduisez encore le problème à RMQ. Nous utilisons un RMQ dimensionnel par Yuan et Atallah pour obtenir une limite supérieure sur la quantité d'espace requise lorsque est fixe.
Réponses:
Vous pouvez économiser beaucoup plus sur la mémoire si vous autorisez simplement la complexité temporelle logarithmique. Vous pouvez implémenter une arborescence de segments kD qui nécessitera une mémoire N * 2 ^ k bits et s'exécute en complexité temporelle logarithmique pour les deux sous-tâches et en complexité temporelle linéaire pour la construction de l'arborescence.
Si vous voulez strictement O (1), pré-calculez tout.
la source