Saya berencana menjalankan "percobaan" ketika mengajar kelas algoritme saya musim gugur ini, dengan satu komputer yang sangat tua dan terbatas (faktor pembatas utama mungkin memori — mungkin serendah 16KB) dan satu modern / standar. Idenya adalah untuk memecahkan masalah dengan polinomial, berjalan pada komputer yang lambat, dan yang eksponensial pada yang cepat (dan, tentu saja, yang lambat menang).
Masalahnya adalah menemukan masalah yang cocok — di mana waktu berjalan akan sangat berbeda untuk contoh dengan ukuran sangat terbatas (dan, lebih disukai, di mana struktur data cukup sederhana; komputer primitif adalah ... primitif). Saya awalnya berpikir tentang algoritma pengurutan (misalnya, kuadratik vs linier), tetapi itu akan membutuhkan contoh yang terlalu besar (kecuali saya pergi dengan bogosort, misalnya).
Saat ini, satu-satunya (agak membosankan) contoh yang saya pikirkan adalah menghitung angka Fibonacci dengan cara yang pintar dan bodoh. Akan menyenangkan untuk memiliki sesuatu yang sedikit kurang lelah / berlebihan, dan lebih disukai sesuatu (semi-) jelas berguna. Ada ide / saran?
sumber
Jawaban:
Sebuah jawaban yang agak menggeneralisasi komentar Neel adalah untuk mencari di bidang pencarian dan pemrograman dinamis, yang penuh dengan algoritme luar biasa yang berkinerja bagus jika Anda menulis dan sangat jika Anda tidak melakukannya - bahkan fungsi faktorial yang membosankan yang Anda pikirkan jatuh dalam hal ini kategori.
Tentu saja, Anda akan dibatasi oleh langit-langit memori pada komputer yang lambat, tetapi saya pikir itu hanya berarti Anda harus berhati-hati bahwa Anda cukup "jahat" pada komputer yang cepat. Inilah beberapa ide spesifik:
Satu ide terakhir adalah Anda dapat mencoba beberapa algoritma di Prolog dengan dan tanpa (tidak perlu) terjadi-cek. Tetapi jika Anda menunjukkan kepada para siswa betapa luar biasanya Prolog tanpa kejadian bermakna yang secara semantik lebih cepat, saya akan menangis. Juga, ini biasanya linear-vs-kuadrat bukan polinomial-versus-eksponensial.
sumber
Anda dapat melakukan pencocokan ekspresi reguler. Pencocokan backtracking yang naif dapat dengan mudah didorong ke perilaku eksponensial pada input yang dapat ditangani oleh pencocokan yang lebih cerdas dalam waktu linier.
sumber
Coba hitung kecocokan sempurna dalam grafik planar, masalah yang seharusnya mudah dijelaskan. Dalam kasus planar, algoritma Fisher-Kastelyen-Temperley memecahkannya dalam waktu polinomial, sedangkan untuk grafik umum masalahnya adalah # P-complete, artinya mungkin tidak ada cara yang lebih cepat daripada melakukan penghitungan brute force. Cukup jalankan FKT pada mesin lambat dan brute force mengandalkan yang cepat.
( Ini juga pertanyaan terkait.)
sumber
Jika Anda mengajarkan algoritma, saya pikir Anda harus melakukan sesuatu yang sederhana, yang menggambarkan ide tersebut. Saya pikir ide algoritma pengurutan Anda sangat bagus dan mungkin berhasil jika Anda mencoba algoritma non-rekursif di komputer primitif.
Saat ini saya sedang membandingkan algoritma pengurutan dan Heap Sort berjalan dengan 17.000 elemen pada komputer dengan ram 32kb.
Saya akan mencoba jenis penyisipan vs Heap Sort.
sumber