Masalah Berhenti menyatakan bahwa tidak mungkin untuk menulis program yang dapat menentukan apakah program lain berhenti, untuk semua program input yang mungkin .
Saya dapat, bagaimanapun, tentu saja menulis sebuah program yang dapat menghitung waktu berjalan dari program seperti:
for(i=0; i<N; i++)
{ x = 1; }
dan mengembalikan kompleksitas waktu , tanpa pernah menjalankannya.
Untuk semua program input lainnya, itu akan mengembalikan sebuah flag yang menunjukkan tidak dapat menentukan kompleksitas waktu.
Pertanyaan saya adalah ini:
Kondisi apa yang harus dipertahankan, sehingga kita dapat secara algoritmik menentukan kompleksitas waktu dari suatu program?
* Jika ada referensi kanonik atau ulasan artikel ini saya akan sangat menghargai tautannya di komentar.
Jawaban:
Secara umum Anda tidak dapat menentukan kompleksitas, bahkan untuk menghentikan program: biarkan menjadi beberapa mesin Turing sembarang dan biarkan p T menjadi program (yang selalu menghasilkan 0):T halT
Jelas bahwa secara umum tidak dapat diputuskan apakah adalah linear-time atau quadratic-time.halT
Namun, banyak pekerjaan telah dilakukan pada perhitungan kompleksitas program yang efektif. Saya memiliki kegemaran khusus untuk Teori Kompleksitas Tersirat yang bertujuan menciptakan bahasa yang, dengan menggunakan konstruksi khusus atau tipe disiplin, memungkinkan seseorang untuk menulis hanya program yang mendiami kelas kompleksitas tertentu yang terdefinisi dengan baik. Dengan apa yang saya anggap sebagai keajaiban, bahasa-bahasa ini sering kali lengkap untuk kelas itu!
Satu contoh yang sangat bagus dijelaskan dalam makalah ini oleh J.-Y. Marion, yang menggambarkan bahasa imperatif kecil, dengan disiplin tipe terinspirasi dari informasi-aliran dan analisis keamanan teknik, yang memungkinkan karakterisasi algoritma di P .
sumber
Pertanyaan yang Anda ajukan dan trik penghitungan spesifik yang Anda gambarkan adalah pertanyaan klasik dalam analisis program. Ada masalah teoretis dari analisis kompleksitas, dan ini merupakan manifestasi praktis dalam hal secara otomatis memperkirakan kinerja sepotong kode. Analisis otomatis semacam itu memiliki beberapa aplikasi mulai dari mendeteksi bug kinerja hingga memperkirakan biaya untuk beberapa komputasi di cloud.
Cody menunjukkan bahwa masalahnya secara umum tidak dapat dipastikan. Masalah ini lebih sulit daripada membuktikan pemutusan hubungan kerja, karena memperoleh batasan kompleksitas mensyaratkan bahwa program juga berakhir. Ada dua pendekatan untuk masalah seperti itu. Salah satunya dari analisis program. Gagasan menambahkan penghitung dan memperkirakan nilainya ada sejak tahun 70-an. Pengkodean ini mengurangi masalah menentukan waktu berjalan untuk menghitung suatu invarian.
Pendekatan kedua adalah merancang bahasa pemrograman yang hanya mengakui program dengan kompleksitas terbatas tertentu. Ini adalah area kompleksitas komputasi implisit.
Beberapa referensi untuk kedua bidang mengikuti.
sumber