Qual è il modo migliore per ottenere un tipo di dati di coda immutabile semplice ed efficiente in Clojure?Coda immutabile in Clojure
Ha solo bisogno di due operazioni, accodare e deselezionare con la solita semantica.
Ho considerato liste e vettori ovviamente, ma capisco che hanno prestazioni relativamente scarse (cioè O (n) o peggio) per le modifiche alla fine e all'inizio rispettivamente - quindi non sono l'ideale per le code!
Idealmente mi piacerebbe una struttura adeguata di dati persistente con O (log n) sia per accodamento e le operazioni dequeue.
Per impedire a qualcuno di scrivere su come utilizzare le liste di controllo per implementare gli stack push/pop (come ho quasi fatto), non dimenticare la domanda che chiede * code *. :-) –
Appena notato c'è una classe chiamata PersistentQueue nell'ultima snapshot Clojure Java 1.2 snapshot .... potrebbe essere la risposta alla mia stessa domanda – mikera
E 'stato lì da sempre (appena controllato con 1.1, ma penso che sia più vecchio di quello). Si noti che non esiste una funzione di fabbrica né una sintassi del lettore fornita per impostazione predefinita; usa 'clojure.lang.PersistentQueue/EMPTY' per ottenere un'istanza vuota. Quindi 'conj',' pop' e 'peek' funzionano come dovrebbero con una coda. Vedi per es. la mia risposta a questa domanda: http://stackoverflow.com/questions/2760017 per alcuni codici scritti con 'c.l.PQ' e' LinkedBlockingQueue' di Java. –