Menurut Pippenger [1996] , ketika membandingkan sistem Lisp yang murni fungsional (dan memiliki semantik evaluasi yang ketat, tidak malas) dengan yang dapat bermutasi data, suatu algoritma yang ditulis untuk Lisp yang tidak murni yang berjalan di O ( n ) dapat diterjemahkan untuk sebuah algoritma dalam Lisp murni yang berjalan dalam waktu O ( n log n ) (berdasarkan kerja oleh Ben-Amram dan Galil [1992] tentang simulasi memori akses acak menggunakan hanya pointer). Pippenger juga menetapkan bahwa ada algoritma yang merupakan yang terbaik yang dapat Anda lakukan; ada masalah yang O ( n ) dalam sistem tidak murni yang Ω ( n log n ) dalam sistem murni.
Ada beberapa peringatan tentang makalah ini. Yang paling penting adalah tidak membahas bahasa fungsional yang malas, seperti Haskell. Bird, Jones dan De Moor [1997] menunjukkan bahwa masalah yang dibangun oleh Pippenger dapat diselesaikan dalam bahasa fungsional yang malas dalam waktu O ( n ), tetapi mereka tidak membangun (dan sejauh yang saya tahu, tidak ada yang memiliki) apakah atau bukan bahasa fungsional yang malas dapat menyelesaikan semua masalah dalam waktu berjalan asimptotik yang sama dengan bahasa dengan mutasi.
Masalah yang dibangun oleh Pippenger membutuhkan Ω ( n log n ) secara khusus dibangun untuk mencapai hasil ini, dan tidak selalu mewakili masalah praktis, masalah dunia nyata. Ada beberapa batasan pada masalah yang sedikit tidak terduga, tetapi diperlukan agar bukti tersebut bekerja; khususnya, masalahnya mensyaratkan bahwa hasil dihitung secara on-line, tanpa dapat mengakses input di masa depan, dan bahwa input terdiri dari urutan atom dari sekumpulan atom yang mungkin tidak terikat, dan bukannya kumpulan ukuran tetap. Dan kertas hanya menetapkan (batas bawah) hasil untuk algoritma waktu berjalan linier yang tidak murni; untuk masalah yang membutuhkan waktu berjalan lebih besar, ada kemungkinan bahwa O ekstra (log n) faktor yang terlihat pada masalah linier mungkin dapat "diserap" dalam proses operasi tambahan yang diperlukan untuk algoritma dengan waktu operasi yang lebih besar. Klarifikasi dan pertanyaan terbuka ini dieksplorasi secara singkat oleh Ben-Amram [1996] .
Dalam praktiknya, banyak algoritma dapat diimplementasikan dalam bahasa fungsional murni dengan efisiensi yang sama seperti dalam bahasa dengan struktur data yang bisa berubah. Untuk referensi yang baik tentang teknik yang digunakan untuk menerapkan struktur data murni fungsional secara efisien, lihat "Struktur Data Murni Fungsional" dari Chris Okasaki [Okasaki 1998] (yang merupakan versi perluasan dari tesisnya [Okasaki 1996] ).
Siapa pun yang perlu menerapkan algoritma pada struktur data yang berfungsi murni harus membaca Okasaki. Anda selalu bisa mendapatkan paling buruk pelambatan O (log n ) per operasi dengan mensimulasikan memori yang bisa berubah dengan pohon biner seimbang, tetapi dalam banyak kasus Anda bisa melakukan jauh lebih baik dari itu, dan Okasaki menjelaskan banyak teknik yang berguna, dari teknik diamortisasi ke real waktu yang melakukan pekerjaan diamortisasi secara bertahap. Struktur data yang murni fungsional bisa agak sulit untuk dikerjakan dan dianalisis, tetapi mereka memberikan banyak manfaat seperti transparansi referensial yang membantu dalam optimasi kompiler, dalam komputasi paralel dan terdistribusi, dan dalam implementasi fitur seperti versi, undo, dan rollback.
Perhatikan juga bahwa semua ini hanya membahas waktu berjalan asimptotik. Banyak teknik untuk menerapkan struktur data yang berfungsi murni memberi Anda sejumlah faktor perlambatan konstan, karena pembukuan tambahan yang diperlukan agar berfungsi, dan detail implementasi bahasa yang bersangkutan. Manfaat dari struktur data yang murni fungsional mungkin lebih penting daripada perlambatan faktor konstan ini, jadi Anda biasanya perlu melakukan trade-off berdasarkan masalah yang dipermasalahkan.
Referensi
- Ben-Amram, Amir dan Galil, Zvi 1992. "On Pointers versus Addresses" Jurnal ACM, 39 (3), hlm. 617-648, Juli 1992
- Ben-Amram, Amir 1996. "Catatan tentang Perbandingan Pippenger tentang Murni dan Tidak Murni" manuskrip yang tidak diterbitkan, DIKU, University of Copenhagen, Denmark
- Bird, Richard, Jones, Geraint, dan De Moor, Oege 1997. "Lebih tergesa-gesa, lebih cepat: evaluasi malas versus bersemangat" Jurnal Pemrograman Fungsional 7, 5 hlm. 541-547, September 1997
- Okasaki, Chris 1996. "Struktur Data Murni Fungsional" Tesis PhD, Universitas Carnegie Mellon
- Okasaki, Chris 1998. "Struktur Data Murni Fungsional" Cambridge University Press, Cambridge, Inggris
- Pippenger, Nicholas 1996. "Pure Versus Impure Lisp" ACM Simposium tentang Prinsip-Prinsip Bahasa Pemrograman, halaman 104–109, Januari 1996