Devo scrivere una RandomQueue che consenta di aggiungere e rimuovere casualmente in Constant Time (O (1)).
Il mio primo pensiero è stato di supportarlo con una sorta di array (ho scelto un ArrayList), poiché gli array hanno accesso costante tramite un indice.
Osservando la documentazione, però, mi sono reso conto che le aggiunte di ArrayLists sono considerate Tempo costante ammortizzato, poiché un'aggiunta può richiedere una riallocazione dell'array sottostante, che è O (n).
Il tempo costante ammortizzato e il tempo costante sono effettivamente uguali o devo esaminare una struttura che non richiede una riallocazione completa su ogni aggiunta?
Lo sto chiedendo perché a parte le strutture basate su array (che per quanto ne so avranno sempre aggiunte Amortized Constant Time), non riesco a pensare a nulla che soddisfi i requisiti:
- Qualsiasi albero basato avrà al massimo l'accesso O (log n)
- Un elenco collegato potrebbe potenzialmente avere aggiunte O (1) (se viene mantenuto un riferimento alla coda), ma una rimozione casuale dovrebbe essere nella migliore delle ipotesi O (n).
Ecco la domanda completa; nel caso in cui ho guardato alcuni dettagli importanti:
Progettare e implementare un RandomQueue. Questa è un'implementazione dell'interfaccia Queue in cui l'operazione remove () rimuove un elemento che viene scelto in modo uniforme a caso tra tutti gli elementi attualmente nella coda. (Pensa a RandomQueue come a un sacchetto in cui possiamo aggiungere elementi o raggiungere e rimuovere ciecamente alcuni elementi casuali.) Le operazioni add (x) e remove () in RandomQueue dovrebbero essere eseguite in tempo costante per operazione.
1/a
possibilità per un'operazione O (n)), ma crescere di un fattore costante a > 1
è O (1) ammortizzato per l'aggiunta: abbiamo una (1/a)^n
possibilità di una O (n) operazione, ma quella probabilità si avvicina a zero per grandi n
.