Kompleksitas algoritma dirancang untuk tidak tergantung pada detail level yang lebih rendah tetapi didasarkan pada model imperatif, mis. Akses array dan memodifikasi sebuah node dalam sebuah pohon membutuhkan waktu O (1). Ini tidak terjadi dalam bahasa fungsional murni. Daftar Haskell membutuhkan waktu linier untuk akses. Memodifikasi sebuah simpul dalam pohon melibatkan pembuatan salinan baru dari pohon tersebut.
Haruskah ada pemodelan alternatif kompleksitas algoritma untuk bahasa fungsional?
ST
monad).Jawaban:
Jika Anda berasumsi bahwa -calculus adalah model bahasa pemrograman fungsional yang baik, maka orang mungkin berpikir: the -calculus memiliki gagasan kompleksitas waktu yang tampaknya sederhana: cukup hitung jumlah langkah pengurangan .λ λ β ( λ x . M) N→ M[ N/ x]
Tetapi apakah ini ukuran kompleksitas yang baik?
Untuk menjawab pertanyaan ini, pertama-tama kita harus menjelaskan apa yang kita maksud dengan ukuran kompleksitas. Satu jawaban yang baik diberikan oleh tesis Slot dan van Emde Boas : segala ukuran kompleksitas yang baik harus memiliki hubungan polinomial dengan gagasan kanonik kompleksitas waktu yang didefinisikan menggunakan mesin Turing. Dengan kata lain, harus ada penyandian yang 'masuk akal' Dari istilah -calculus ke mesin Turing, seperti untuk beberapa polinomial , dalam kasus ini untuk setiap istilah ukuran: direduksi menjadi nilai dalam -pengurangan langkah tepat saat berkurang menjadi nilait r ( . ) λ hal M. | M.| M. p ( | M| ) β t r ( M) p ( | t r ( M) | ) langkah-langkah mesin Turing.
Untuk waktu yang lama, tidak jelas apakah ini dapat dicapai dalam kalkulus λ. Masalah utama adalah sebagai berikut.
Makalah " Pengurangan Beta adalah Invariant, Memang " oleh B. Accattoli dan U. Dal Lago mengklarifikasi masalah ini dengan menunjukkan pengkodean 'masuk akal' yang menjaga kompleksitas kelas P fungsi waktu polinomial, dengan asumsi pengurangan panggilan-nama dengan nama paling kiri dari luar . Wawasan utama adalah ledakan eksponensial hanya dapat terjadi karena alasan 'tidak menarik' yang dapat dikalahkan dengan pembagian yang tepat. Dengan kata lain, kelas P sama apakah Anda mendefinisikannya dengan menghitung langkah mesin Turing atau (paling kiri) -pengurangan.β
Saya tidak yakin apa situasinya untuk strategi evaluasi lainnya. Saya tidak menyadari bahwa program serupa telah dilakukan untuk kompleksitas ruang.
sumber
Tidak terlalu. Kami selalu menghitung operasi dasar dalam beberapa model mesin:
Anda mungkin berpikir dari keseluruhan / / -Bisnis. Meskipun benar bahwa Anda dapat mengabstraksi beberapa detail implementasi dengan asimtotik Landau, Anda tidak menyingkirkan dampak dari model mesin. Algoritma memiliki waktu operasi yang sangat berbeda, katakanlah TM dan RAM - bahkan jika Anda hanya mempertimbangkan -classes!Ω Θ HAI Θ
Karenanya, pertanyaan Anda memiliki jawaban sederhana: perbaiki model mesin dan "operasi" mana yang harus dihitung. Ini akan memberi Anda sebuah ukuran. Jika Anda ingin hasil yang dapat dibandingkan dengan algoritma non-fungsional, sebaiknya Anda mengkompilasi program Anda ke RAM (untuk analisis algoritma) atau TM (untuk teori kompleksitas), dan menganalisis hasilnya. Teorema transfer mungkin ada untuk memudahkan proses ini.
sumber
O(1)
ketika itu benarO(log ab)
Alih-alih merumuskan ukuran kompleksitas Anda dalam hal beberapa mesin abstrak yang mendasari, Anda dapat memanggang biaya ke dalam definisi bahasa itu sendiri - ini disebut Dynamics Biaya . Satu melampirkan biaya untuk setiap aturan evaluasi dalam bahasa, dengan cara komposisi - yaitu, biaya operasi adalah fungsi dari biaya sub-ekspresi. Pendekatan ini paling alami untuk bahasa fungsional, tetapi dapat digunakan untuk bahasa pemrograman yang terdefinisi dengan baik (tentu saja, kebanyakan bahasa pemrograman sayangnya tidak terdefinisi dengan baik).
sumber