Apakah ada konsep untuk suatu algoritma yang menghitung suatu fungsi dengan terlebih dahulu menemukan algoritma lain?

14

Jika saya memahaminya dengan benar, sebuah algoritma yang menghitung nilai fungsi nyata f memiliki kompleksitas komputasi jika yang berikut ini berlaku: Ketika kita menghitung ke presisi memerlukan urutan langkah .O(g(n))fδg(n)

Namun, bagaimana jika kita memiliki algoritma yang pertama "menemukan algoritma yang lebih efisien untuk menghitung ", dan kemudian menghitung ?ff

Dengan kata lain, bagaimana jika kita memiliki algoritma yang melakukan hal berikut:A

  1. Temukan algoritma efisien untuk komputasi .Bf

  2. gunakan untuk menghitung .Bf

Dalam hal ini, kita tidak lagi dapat berbicara tentang waktu komputasi yang dibutuhkan untuk menghitung misalnya, karena sepenuhnya tergantung pada apakah Algoritma telah menemukan algoritma . Dengan kata lain, waktu komputasi yang diperlukan untuk menghitung jika adalah angka komoputasi pertama jauh lebih besar daripada waktu komputasi yang diperlukan untuk menghitung setelah sudah dihitung.f(5)ABf(5)5f(5)f(3)

Pertanyaan saya adalah, adakah konsep / teori tentang algoritma semacam ini yang pertama kali menemukan algoritma lain sebelum menghitung suatu fungsi? Secara khusus saya bertanya-tanya tentang analisis kompleksitas komputasi dari algoritma tersebut.

pengguna56834
sumber
1
Apakah Anda mengatakan bahwa Mathematica pada dasarnya melakukan apa yang Anda minta? Anda memberikannya persamaan untuk dipecahkan dan secara otomatis mencari tahu algoritma mana yang digunakan untuk menyelesaikan persamaan tersebut, lalu memecahkannya.
user541686
Lihat itu.dk/people/sestoft/pebook , itu relevan.
Nathan Ringo

Jawaban:

18

f(n)O(f(n))

Meskipun algoritma Levin tidak praktis (karena konstanta besar yang terlibat), sangat menarik secara teoritis. Lihat artikel Scholarpedia untuk lebih lanjut tentang pencarian universal.

Yuval Filmus
sumber
10

Misalkan kita memiliki fungsi fyang mengambil argumen xtipe A, dan menampilkan fungsi lain yang mengambil argumen ytipe Bdan mengembalikan hasil tipe C. Dalam kata-kata Anda, fambil argumen xdan kembalikan "algoritma" yang mengambil input tipe Bdan hasil dari tipe C.

Fungsi fmemiliki tipe

A → (B → C)

Memang, dibutuhkan x : Adan mengembalikan fungsi tipe B → C. Namun demikian, fekuivalen dengan fungsi g : A × B → Cyang membutuhkan keduanya x dan ysekaligus dan memberi Anda hasil akhir. Memang, ada isomorfisme di antara kedua tipe itu

A → (B → C)

dan

A × B → C

karena kita dapat menentukan gdalam hal fsebagai

g(x, y) := f(x)(y)

dan kita dapat mendefinisikan fdalam hal gsebagai

f(x) := (y ↦ g(x,y))

Operasi passing dari gke fdisebut currying dan programmer fungsional menggunakannya setiap saat. Dalam teori komputabilitas, gagasan untuk mengambil satu input dan mengeluarkan suatu fungsi (algoritma) diwujudkan dalam teorema smn .

Jawaban atas pertanyaan Anda adalah "ya, orang-orang melakukan ini sepanjang waktu". Tetapi ada juga yang bermoral: suatu algoritma yang menemukan suatu algoritma masih hanya sebuah algoritma.

Andrej Bauer
sumber
1
+1 untuk kalimat terakhir itu. Kata baik.
John Coleman
f(5)c+ccf(5)f(5)c1+c2c1c2c1>c2
@ Programmer2134 apakah optimisasi kompiler akan menjadi konsep yang Anda minati? Saya tidak yakin dengan teori di balik ini sama sekali (terutama interaksinya dengan teori kompleksitas), tetapi ini bisa menjadi contoh potensial
Mark
Kata kunci yang harus dicari adalah "evaluasi parsial".
Andrej Bauer