J'ai un grand ensemble de données de Person
objets qui sont mis en file d'attente dans une liste. Je souhaite que la structure de données puisse effectuer les opérations suivantes de manière efficace.Structure de données à temps constant pour insérer, contenir, supprimer et obtenir des éléments par index
- Ajoutez un
Person
à la fin de la file d'attente. - Supprimez le premier
Person
. - Si un
Person
existe, le cas échéant, supprimez-le et placez-le à la fin de la file d'attente. - Obtenez un
Person
particulier par sa position.
Est-il possible d'avoir le temps O (1) pour toutes ces opérations? Jusqu'à présent, j'ai trouvé deux façons, mais elles ne sont pas optimales.
ArrayList<Person>
+HashMap<Person, Integer>
Les
HashMap
stocke l'index des objets.Person
Cela donne O (n) pour un fonctionnement 2 et 3 (élimination élément dans leArrayList
)ArrayDeque<Person>
/LinkedList<Person>
Ils donnent O (1) pendant les 2 premières opérations, mais O (n) pour la dernière deux.
La complexité de l'espace ne doit pas être supérieure à O (n) dans mon cas. L'opération 4 est moins intensive, donc je pourrais tolérer un moyen un peu inefficace de le faire.
Toutes les suggestions seraient appréciées. Merci d'avance!
Je ne pense pas que vous pouvez réduire la complexité pour les deux dernières opérations. Pour chercher dans une liste, la complexité temporelle va certainement être O (n) jusqu'à et à moins que la liste ne soit triée. – Karan
@Karan La recherche en O (1) est possible avec des tables de hachage. Je pense qu'au moins trois des opérations peuvent être en O (1), sinon toutes. – Dabiuteef