Attualmente sto lavorando con Robert Sedgewicks "Algorithms in java" (3a edizione, tedesco) da solo e attualmente sono a una delle domande più complicate. Penso di poter avere il punto di partenza per una soluzione, ma non sono sicuro che sia davvero il modo migliore per andare.
L'esercizio (tradotto):
Crea un tipo di dati astratto di una coda ad accesso casuale: scrivi un'interfaccia e un'implementazione che utilizza un elenco collegato come struttura dati di base. Sii il più efficiente possibile nelle implementazioni dei metodi "put" e "get" e analizza il loro costo nel peggiore dei casi.
Per chiarezza: il metodo put inserisce un elemento alla fine della coda. Solo il metodo get ha una parte casuale, in cui accede a una parte casuale dell'elenco collegato, ne restituisce il valore e rimuove l'elemento dall'elenco collegato.
Le mie idee finora:
1. Implementa l'elenco collegato utilizzando gli oggetti nodo
Questa è l'implementazione più ovvia, implementando un elenco collegato utilizzando oggetti Node che contengono un valore (può essere un tipo di dati primitivo o un oggetto) e un riferimento al nodo successivo. Quindi avere un riferimento "testa" e un riferimento "coda" memorizzato nella classe dell'implementazione della coda. Il metodo get in questo caso dovrebbe prima calcolare un numero compreso tra 0 e "queueSize" (il numero di elementi nella coda) e quindi passare da nodo a nodo (iniziando con head) utilizzando il riferimento in "next" "queueSize" volte, restituire il valore del nodo su cui si atterra e quindi rimuoverlo dall'elenco.
Tuttavia, dubito che sia il metodo più efficiente e non vedo un modo per renderlo efficiente.
2. Implementa l'elenco collegato utilizzando una serie di oggetti nodo
Implementando l'elenco collegato della coda utilizzando una serie di nodi, gli oggetti nodo contengono nuovamente un valore (può essere un tipo di dati primitivo o un oggetto) e un riferimento a un altro nodo o null. Si potrebbe quindi accedere a un nodo casuale generando casualmente un indice tra 0 e la lunghezza dell'array e accedendo all'oggetto Node in quella cella. Il problema qui risiede ovviamente nel fatto che non tutti i nodi nell'array faranno parte della lista collegata in ogni momento. E non vedo un modo efficiente / rapido per ottenere quell'informazione.
Quindi la mia domanda è, quale implementazione della lista collegata è la strada da percorrere qui? C'è un modo per assicurarsi che un numero generato in modo casuale in un elenco di elenchi concatenati basato su array punti solo su celle di matrice che fanno parte dell'elenco collegato? O c'è un modo per scrivere un metodo get efficiente per il primo approccio?