Secondo Pippenger [1996] , quando si confronta un sistema Lisp che è puramente funzionale (e ha una semantica di valutazione rigorosa, non pigra) con uno che può mutare i dati, un algoritmo scritto per l'implicito Lisp che gira in O ( n ) può essere tradotto ad un algoritmo nel puro Lisp che gira in tempo O ( n log n ) (basato sul lavoro di Ben-Amram e Galil [1992] sulla simulazione della memoria ad accesso casuale usando solo puntatori). Pippenger stabilisce anche che esistono algoritmi per i quali è il meglio che puoi fare; ci sono problemi che sono O ( n ) nel sistema impuro che sono Ω ( n log n ) nel sistema puro.
Ci sono alcuni avvertimenti su questo documento. Il più significativo è che non si rivolge a linguaggi funzionali pigri, come Haskell. Bird, Jones e De Moor [1997] dimostrano che il problema costruito da Pippenger può essere risolto in un linguaggio funzionale pigro in O ( n ) tempo, ma non stabiliscono (e per quanto ne so, nessuno ha) se o non un linguaggio funzionale pigro può risolvere tutti i problemi nello stesso tempo di esecuzione asintotico di un linguaggio con mutazione.
Il problema creato da Pippenger richiede che Ω ( n log n ) sia specificamente progettato per ottenere questo risultato e non è necessariamente rappresentativo di problemi pratici del mondo reale. Ci sono alcune restrizioni al problema che sono un po 'inaspettate, ma necessarie affinché la prova funzioni; in particolare, il problema richiede che i risultati vengano calcolati online, senza poter accedere a input futuri e che l'input sia costituito da una sequenza di atomi da un insieme illimitato di possibili atomi, piuttosto che da un set di dimensioni fisse. E il documento stabilisce solo risultati (limite inferiore) per un algoritmo impuro di tempo di esecuzione lineare; per problemi che richiedono un tempo di esecuzione maggiore, è possibile che la O aggiuntiva (log n) il fattore riscontrato nel problema lineare può essere in grado di essere "assorbito" nel processo di operazioni extra necessarie per algoritmi con tempi di esecuzione maggiori. Questi chiarimenti e domande aperte vengono esplorati brevemente da Ben-Amram [1996] .
In pratica, molti algoritmi possono essere implementati in un linguaggio funzionale puro con la stessa efficienza di un linguaggio con strutture di dati mutabili. Per un buon riferimento sulle tecniche da utilizzare per implementare in modo efficiente strutture di dati puramente funzionali, vedere "Strutture di dati puramente funzionali" di Chris Okasaki [Okasaki 1998] (che è una versione estesa della sua tesi [Okasaki 1996] ).
Chiunque abbia bisogno di implementare algoritmi su strutture di dati puramente funzionali dovrebbe leggere Okasaki. Puoi sempre ottenere nel peggiore dei casi un rallentamento O (log n ) per operazione simulando la memoria mutabile con un albero binario bilanciato, ma in molti casi puoi fare molto meglio di così, e Okasaki descrive molte tecniche utili, dalle tecniche ammortizzate a quelle reali- quelli che eseguono il lavoro ammortizzato in modo incrementale. Le strutture di dati puramente funzionali possono essere un po 'difficili da lavorare e analizzare, ma offrono molti vantaggi come la trasparenza referenziale che sono utili nell'ottimizzazione del compilatore, nel calcolo parallelo e distribuito e nell'implementazione di funzionalità come il versioning, l'annullamento e il rollback.
Si noti inoltre che tutto ciò discute solo i tempi di esecuzione asintotici. Molte tecniche per l'implementazione di strutture di dati puramente funzionali forniscono una certa quantità di costante rallentamento dei fattori, a causa della contabilità aggiuntiva necessaria per il loro funzionamento e dei dettagli di implementazione della lingua in questione. I vantaggi di strutture di dati puramente funzionali possono superare questi rallentamenti dei fattori costanti, quindi in genere sarà necessario effettuare dei compromessi in base al problema in questione.
Riferimenti
- Ben-Amram, Amir e Galil, Zvi 1992. "On Pointers versus Addresses" Journal of ACM, 39 (3), pp. 617-648, luglio 1992
- Ben-Amram, Amir 1996. "Note sul confronto tra Pippenger di Lisp puro e impuro" Manoscritto inedito, DIKU, Università di Copenaghen, Danimarca
- Bird, Richard, Jones, Geraint e De Moor, Oege 1997. "Più fretta, meno velocità: valutazione pigra contro desiderosa" Journal of Functional Programming 7, 5 pp. 541-547, settembre 1997
- Okasaki, Chris 1996. Tesi di dottorato "Strutture di dati puramente funzionali" , Carnegie Mellon University
- Okasaki, Chris 1998. "Strutture di dati puramente funzionali" Cambridge University Press, Cambridge, Regno Unito
- Pippenger, Nicholas 1996. Simposio ACM "Pure Versus Impure Lisp" sui principi dei linguaggi di programmazione, pagine 104-109, gennaio 1996