Contoh masalah dengan solusi polinomial dan eksponensial, dan jejak kecil?

8

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?

Magnus Lie Hetland
sumber
Sebenarnya, saya berencana menggunakan solusi pseudopolinomial ("linear dalam Fibonacci") dan superexponential (rekursif) untuk masalah tersebut; poin utama adalah perbedaan yang jelas dalam kompleksitas, yang memungkinkan komputer yang lebih lemah menang dengan mudah.
Magnus Lie Hetland
1
Pencocokan berat maksimum Bipartit (Hungaria vs. brute-force)?
Jukka Suomela

Jawaban:

6

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:

  • Diberi grafik besar yang tidak terarah, temukan jalur antara dua titik. Komputer cepat mengimplementasikan pencarian acak (wajar, atau mungkin tidak berakhir!) Melalui grafik, sedangkan komputer lambat dengan tenang melakukan pencarian pertama-pertama atau mendalam-pertama. Anda mungkin perlu menjalankan ini pada beberapa uji coba untuk memastikan bahwa perbedaan kinerja terlihat.
  • Dapatkan grafik terarah dan coba temukan jalur terpendek antara dua titik: komputer cepat menghitung semua jalur asiklik (menggunakan algoritme deteksi siklus kura-kura dan kelinci di setiap langkah, bwahahahaha) terlebih dahulu, dan komputer lambat dengan sabar menjalankan sumber tunggal terpendek jalan.
  • Algoritma edit jarak? Algoritma pemrograman yang lebih naif daripada dinamis mungkin akan benar-benar tercekik di sini.

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.

Rob Simmons
sumber
9

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.

Neel Krishnaswami
sumber
5

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

Martin Schwarz
sumber
1

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.

Topo
sumber
Tetapi penyisipan semacam 17000 elemen pada komputer modern cukup cepat. (Pertanyaannya sudah menyinggung ini.)
Radu GRIGore