J'ai besoin d'écrire une RandomQueue qui permet les ajouts et la suppression aléatoire en temps constant (O (1)).
Ma première pensée a été de le sauvegarder avec une sorte de tableau (j'ai choisi une liste de tableaux), car les tableaux ont un accès constant via un index.
En parcourant la documentation, j'ai réalisé que les ajouts d'ArrayLists sont considérés comme du temps constant amorti, car un ajout peut nécessiter une réallocation du tableau sous-jacent, qui est O (n).
Le temps constant amorti et le temps constant sont-ils effectivement les mêmes, ou dois-je examiner une structure qui ne nécessite pas de réaffectation complète à chaque ajout?
Je pose cette question parce que, outre les structures basées sur les tableaux (qui, pour autant que je sache, auront toujours des ajouts à temps constant amorti), je ne pense à rien qui répondra aux exigences:
- Tout arbre basé aura au mieux un accès O (log n)
- Une liste chaînée pourrait potentiellement avoir des ajouts d'O (1) (si une référence à la queue est conservée), mais une suppression aléatoire devrait être au mieux O (n).
Voici la question complète; au cas où je verrais certains détails importants:
Concevez et implémentez une RandomQueue. Il s'agit d'une implémentation de l'interface Queue dans laquelle l'opération remove () supprime un élément qui est choisi uniformément au hasard parmi tous les éléments actuellement dans la file d'attente. (Considérez une RandomQueue comme un sac dans lequel nous pouvons ajouter des éléments ou atteindre et supprimer aveuglément des éléments aléatoires.) Les opérations add (x) et remove () dans une RandomQueue doivent s'exécuter en temps constant par opération.
1/a
chance pour une opération O (n)), mais une croissance d'un facteur constant a > 1
est O (1) amorti pour l'addition: nous avons une (1/a)^n
chance d'un O (n) opération, mais cette probabilité s'approche de zéro pour grand n
.