Ho bisogno di scrivere un RandomQueue che consenta l'aggiunta e la rimozione casuale in Costante (O (1)).
Il mio primo pensiero è stato di appoggiarlo con una sorta di matrice (ho scelto una lista array), poiché gli array hanno accesso costante tramite un indice.
Guardando oltre la documentazione, ho capito che le aggiunte di ArrayLists sono considerate Tempo Amortizzato Costante, poiché un'aggiunta potrebbe richiedere una riallocazione dell'array sottostante, che è O (n).
Il tempo costante e il tempo costante ammortizzati sono gli stessi o ho bisogno di guardare ad alcune strutture che non richiedono una riallocazione completa su ogni aggiunta?
Lo sto chiedendo a parte le strutture basate su array a parte (che per quanto ne so avranno sempre addizioni a tempo costante ammortizzato), non riesco a pensare a nulla che soddisfi i requisiti:
- Qualunque struttura ad albero avrà al massimo O (log n) accesso
- Una lista collegata potrebbe potenzialmente avere aggiunte O (1) (se viene mantenuto un riferimento alla coda), ma una rimozione casuale dovrebbe essere al massimo O (n).
Ecco la domanda completa; nel caso in cui avessi lustrato alcuni dettagli importanti:
Design and implement a RandomQueue. This is an implementation of the Queue interface in which the remove() operation removes an element that is chosen uniformly at random among all the elements currently in the queue. (Think of a RandomQueue as a bag in which we can add elements or reach in and blindly remove some random element.) The add(x) and remove() operations in a RandomQueue should run in constant time per operation.