2012-10-02 15 views
12

Questo post tratta solo di scala.collection.mutable.LinkedList. Altre implementazioni non sono l'argomento di questa discussione.Caso di utilizzo per LinkedList

La mia domanda è: qual è il caso d'uso di questa classe? Trovo che abbia i problemi di entrambi i tipi di strutture mutevoli e immutabili mentre produce i benefici di nessuno. Lo dico perché:

  • l'API guarda a me come se si trattasse di un API immutabili (filter, map, drop, take ecc tutti restituire un nuovo LinkedList invece di fare modifiche in-place)
  • tutto il benefici della lista collegata immutabili sono, almeno credo, non presente, vale a dire la massima condivisione tra strutture, dal momento che questi sono ancora mutevoli (attraverso var elem e var next.

Quindi fondamentalmente abbiamo un tempo di accesso lineare, ap lineari tempo pendolare, spazio lineare ecc. e nulla da mostrare per esso nella complessità dello spazio o nella capacità di ragionare sul codice (tranne forse il prefisso O (1) ma è ancora il caso con elenchi immutabili).

Non riesco a vedere un vantaggio importante di questo tipo di struttura? Sto cercando misure oggettive e/o casi d'uso applicabili a questa classe.

+1

Sembra un involucro sottile attorno alla classe immutabile. Beneficio: chi l'ha scritto è riuscito a farlo molto rapidamente, senza preoccuparsi di introdurre bugs? – bdares

+4

@bdares cosa ti fa pensare che? Ho dato una rapida occhiata alla fonte e sembra che non sia così. –

+0

hmmm ... come qualsiasi tipo mutabile, può essere referenziato da diversi puntatori e una volta modificato, i cambiamenti saranno visibili da tutti i puntatori. Questo non ha nulla a che fare con la complessità del tempo. – Oren

risposta

4

Direi che il motivo è la complessità: la classe elenco collegato consente di mantenere un riferimento a un nodo nel mezzo dell'elenco e utilizzare insert o update in quel nodo, invece di passare attraverso il capo del elenco.

[] --> [] --> ... --> [] --> ... --> [] --| 
^     ^
head     myReference 

In un'applicazione in cui so esattamente dove un cambiamento di qualche sequenza accadrà (myReference sopra), costa molto meno di modificare quella posizione che copiare tutto ciò fino a quella posizione, come sarebbe il caso con immutable.List (cioè inserisco appena un nuovo nodo dopo myReference).

       myNewNode 
          v 
[] --> [] --> ... --> [] --> [] ---> ... --> [] --| 
^     ^
head     myReference 

Un esempio di tale applicazione - un L-system dove si espande parti di una stringa. È molto più economico inserire nuovi nodi sul posto, piuttosto che copiare l'intera stringa ogni volta che deve essere espansa.

Un altro motivo è la completezza - dal DoubleLinkedList e LinkedListLike condividono un sacco di un'infrastruttura comune, fornendo un ulteriore LinkedList classe è venuto come un basso costo per la dimensione libreria standard.

+0

ragioni abbastanza buone. Anche se mi chiedo, c'è qualche motivo speciale per cui non ci sono implementazioni per idiomi sul posto come mappa, filtro, ecc.? – m09

+0

C'è stata molta discussione a riguardo.Ciò è in parte dovuto al fatto che molti non sono implementabili facilmente o del tutto ('filtro' sul posto su un' Array', o 'patch', o anche un' flatMap'!), In parte a causa di motivi di prestazione (ci crediate o no , un aggiornamento sul posto non è sempre più rapido di un aggiornamento della copia) e in parte dovuto a problemi di denominazione. Esiste, tuttavia, un'operazione che è genericamente implementabile su sequenze mutabili, e cioè 'transform' - che semplicemente chiama' update' su ogni elemento. – axel22

+0

per me ha senso, ma mi chiedo ancora perché i tratti generali su cui tali implementazioni sarebbero possibili sono lasciati vuoti. Suppongo comunque che non siano troppo difficili da implementare e che ridurre il rumore nell'API sia preferibile a dare implementazioni già fatte. Grazie :) – m09

Problemi correlati