Sejauh mana suatu algoritma dapat memprediksi kompleksitas waktu suatu program input yang berubah-ubah?

23

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.N

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.

Doyan
sumber
1
(1) “Notasi-O” tidak berarti “kompleksitas waktu.” (2) Tidak jelas apa yang Anda maksud dengan “O (tanpa batas).” Harap hindari menciptakan notasi baru jika memungkinkan. (3) Memutuskan apakah suatu program berhenti atau tidak dan memberikan batas atas eksplisit pada kompleksitas waktu program berbeda.
Tsuyoshi Ito
1
Saya tidak terbiasa dengan kerumitan waktu menyimpulkan program di kelas terbatas, tetapi satu kelas program yang mungkin perlu diperiksa disebut "program loop terbatas," yang mudah untuk mengikat kompleksitas waktu. Saya ingat bahwa program loop terbatas dibahas dalam Bab 3 tentang Permata Ilmu Komputer Teoretis oleh Uwe Schöning dan Randall J. Pruim dalam konteks menentukan ekivalensi dua program, tetapi saya tidak yakin seberapa relevan bab ini dengan pertanyaan Anda.
Tsuyoshi Ito
4
Saya agak bingung. Dengan cara apa ini di luar ruang lingkup? Satu jawaban yang masuk akal untuk pertanyaan OP adalah fragmen bahasa (atau bahkan kelas fragmen) yang waktu runningnya dapat ditentukan secara algoritmik.
Suresh Venkat
4
Pertanyaan terkait: Apakah batas runtime dalam P dapat dipilih?
Artem Kaznatcheev
7
Saya sangat terlambat untuk utas komentar ini. Kami sepertinya menerkam saat sebuah posting berbau newbie-ish. Saya tidak menunjuk jari. Saya merasakan insting ini sendiri. Mungkin kita harus lebih lembut. OP mengaku tidak terbiasa dengan area atau ketentuan. Apa gunanya situs tanya jawab jika kita hanya mentolerir orang yang tahu persis apa yang mereka inginkan, dan menanyakannya dalam bahasa kita.
Vijay D

Jawaban:

23

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):TpT

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

Jelas bahwa secara umum tidak dapat diputuskan apakah adalah linear-time atau quadratic-time.pT

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 .

cody
sumber
Sebagai catatan tambahan, lihat juga Epigram, yang merupakan bahasa yang dapat menjamin pemutusan hubungan kerja.
Realz Slaw
Ini adalah awal yang baik, tetapi apakah ada lagi yang bisa dikatakan? (Misalnya, bagi saya tampaknya runtime fungsi rekursif dasar yang diberikan harus langsung dihitung, namun fungsi tersebut dapat menyelesaikan masalah dalam hierarki eksponensial ....)
usul
Sejauh dimungkinkan untuk menentukan bahwa program input ditulis dalam bahasa yang terbatas, Anda dapat mengasumsikan kompleksitas waktu dibatasi oleh apa pun batas atas yang diberlakukan oleh bahasa tersebut. Namun, banyak fungsi rekursif primitif memiliki padanan rekursif umum yang lebih efisien
Chris Pressey
1
(secara tidak sengaja menyimpan komentar itu lebih awal, kemudian melampaui batas 5 menit. Kalimat kedua harus berbunyi sebagai berikut :) Namun, program dalam bahasa yang dibatasi ini mungkin memiliki padanan dalam bahasa yang tidak terbatas yang lebih efisien (khususnya, banyak fungsi rekursif primitif memiliki padanan rekursif umum yang lebih efisien) yang, dalam praktiknya, mendorong penggunaan bahasa yang tidak dibatasi, sulit untuk dianalisis.
Chris Pressey
Itu Chris yang sangat menarik! Apakah Anda punya referensi? Bahkan tampaknya kontra-tidak aktif: Saya akan menduga fungsi rekursif primitif dapat mensimulasikan fungsi rekursif umum untuk sejumlah langkah tertentu, yang kemudian akan membatasi percepatan hingga beberapa faktor konstan.
cody
11

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.

  1. Proyek SPEED , adalah satu garis khusus pekerjaan analisis program yang berfokus pada cara menemukan batasan pada penghitung yang pernah dimasukkan ke dalam program. Penghitung dapat mengukur konsumsi ruang atau waktu.
  2. Analisis sumber daya diamortisasi multivariat , Jan Hoffman, Klaus Aehlig, Martin Hoffman, ACM TOPLAS 2012
  3. Pada Properti Tingkat Laju Pertumbuhan yang Dapat Dianggap dari Program Imperatif , Amir Ben Amram, Perkembangan dalam Complusational Compisit implisit 2010. Ini adalah garis yang indah dari pekerjaan yang membatasi kompleksitas program imperatif dengan pembatasan sintaksis.
Vijay D
sumber