Laut Pippenger [1996] kann beim Vergleich eines rein funktionalen (und nicht faulen) Lisp-Systems mit einem System, das Daten mutieren kann, ein Algorithmus übersetzt werden, der für das unreine Lisp geschrieben wurde, das in O ( n ) ausgeführt wird zu einem Algorithmus in der reinen Lisp, der in O ( n log n ) -Zeit ausgeführt wird (basierend auf Arbeiten von Ben-Amram und Galil [1992] zur Simulation des Direktzugriffsspeichers mit nur Zeigern). Pippenger stellt auch fest, dass es Algorithmen gibt, für die dies das Beste ist, was Sie tun können. Es gibt Probleme, die im unreinen System O ( n ) sind und im reinen System Ω ( n log n ) sind.
Bei diesem Papier sind einige Einschränkungen zu beachten. Das wichtigste ist, dass es sich nicht um faule funktionale Sprachen wie Haskell handelt. Bird, Jones und De Moor [1997] zeigen, dass das von Pippenger konstruierte Problem in O ( n ) Zeit in einer faulen funktionalen Sprache gelöst werden kann , aber sie stellen nicht fest (und soweit ich weiß, hat niemand), ob oder Keine faule funktionale Sprache kann alle Probleme in derselben asymptotischen Laufzeit lösen wie eine Sprache mit Mutation.
Das von Pippenger konstruierte Problem erfordert , dass der in dem linearen Problem gesehene Ω ( n log n ) speziell konstruiert ist, um dieses Ergebnis zu erzielen, und ist nicht unbedingt repräsentativ für praktische Probleme in der realen Welt. Es gibt einige Einschränkungen für das Problem, die etwas unerwartet sind, aber erforderlich sind, damit der Beweis funktioniert. Das Problem erfordert insbesondere, dass die Ergebnisse online berechnet werden, ohne auf zukünftige Eingaben zugreifen zu können, und dass die Eingabe aus einer Folge von Atomen aus einer unbegrenzten Menge möglicher Atome und nicht aus einer Menge fester Größe besteht. Und das Papier legt nur (untere Grenze) Ergebnisse für einen unreinen Algorithmus der linearen Laufzeit fest; Bei Problemen, die eine längere Laufzeit erfordern, ist es möglich, dass das zusätzliche O (log n ) -Faktor bei zusätzlichen Operationen, die für Algorithmen mit längeren Laufzeiten erforderlich sind, möglicherweise "absorbiert" werden kann. Diese Klarstellungen und offenen Fragen werden von Ben-Amram [1996] kurz untersucht .
In der Praxis können viele Algorithmen in einer reinen Funktionssprache mit der gleichen Effizienz wie in einer Sprache mit veränderlichen Datenstrukturen implementiert werden. Eine gute Referenz zu Techniken zur effizienten Implementierung rein funktionaler Datenstrukturen finden Sie in Chris Okasakis "Rein funktionale Datenstrukturen" [Okasaki 1998] (eine erweiterte Version seiner Arbeit [Okasaki 1996] ).
Jeder, der Algorithmen für rein funktionale Datenstrukturen implementieren muss, sollte Okasaki lesen. Sie können im schlimmsten Fall immer eine O (log n ) -Verzögerung pro Operation erzielen, indem Sie veränderlichen Speicher mit einem ausgeglichenen Binärbaum simulieren. In vielen Fällen können Sie jedoch erheblich bessere Ergebnisse erzielen, und Okasaki beschreibt viele nützliche Techniken, von amortisierten Techniken bis hin zu realen. Zeit diejenigen, die die amortisierten Arbeit schrittweise erledigen. Rein funktionale Datenstrukturen können etwas schwierig zu bearbeiten und zu analysieren sein, bieten jedoch viele Vorteile wie referenzielle Transparenz, die bei der Compileroptimierung, beim parallelen und verteilten Rechnen sowie bei der Implementierung von Funktionen wie Versionierung, Rückgängigmachen und Rollback hilfreich sind.
Beachten Sie auch, dass in all dem nur asymptotische Laufzeiten behandelt werden. Viele Techniken zur Implementierung rein funktionaler Datenstrukturen führen zu einer gewissen konstanten Verlangsamung des Faktors, da zusätzliche Buchhaltung erforderlich ist, damit sie funktionieren, und Implementierungsdetails der betreffenden Sprache. Die Vorteile rein funktionaler Datenstrukturen können diese konstanten Faktorverlangsamungen überwiegen. Daher müssen Sie im Allgemeinen Kompromisse eingehen, die auf dem betreffenden Problem basieren.
Verweise
- Ben-Amram, Amir und Galil, Zvi 1992. "On Pointers versus Addresses" Journal of the ACM, 39 (3), S. 617-648, Juli 1992
- Ben-Amram, Amir 1996. "Anmerkungen zu Pippengers Vergleich von reinem und unreinem Lisp" Unveröffentlichtes Manuskript, DIKU, Universität Kopenhagen, Dänemark
- Bird, Richard, Jones, Geraint und De Moor, Oege 1997. "Mehr Eile, weniger Geschwindigkeit: faule versus eifrige Bewertung" Journal of Functional Programming 7, 5 S. 541–547, September 1997
- Okasaki, Chris 1996. Doktorarbeit "Rein funktionale Datenstrukturen" , Carnegie Mellon University
- Okasaki, Chris 1998. "Rein funktionale Datenstrukturen" Cambridge University Press, Cambridge, UK
- Pippenger, Nicholas 1996. ACM-Symposium "Pure Versus Impure Lisp" zu Prinzipien von Programmiersprachen, Seiten 104–109, Januar 1996