Saya tertarik pada pertanyaan tentang cara terbaik untuk mengajarkan kelengkapan NP ke jurusan ilmu komputer. Secara khusus, haruskah kita mengajarkannya menggunakan pengurangan Karp atau menggunakan pengurangan Turing?
Saya merasa bahwa konsep pelengkapan dan pengurangan NP adalah sesuatu yang harus dipelajari oleh setiap ilmu komputer. Namun, ketika mengajarkan kelengkapan NP, saya perhatikan bahwa penggunaan pengurangan Karp memiliki beberapa kelemahan.
Pertama-tama, pengurangan Karp tampaknya tidak perlu membingungkan bagi beberapa siswa. Gagasan intuitif tentang pengurangan adalah "jika saya memiliki algoritma untuk menyelesaikan masalah X, maka saya dapat menggunakannya untuk menyelesaikan masalah Y juga". Itu sangat intuitif - tetapi memetakan jauh lebih baik untuk pengurangan Turing daripada pengurangan Karp. Sebagai hasilnya, saya melihat siswa yang mencoba untuk membuktikan kelengkapan NP bisa disesatkan oleh intuisi mereka dan membentuk bukti yang salah. Mencoba untuk mengajarkan kedua jenis reduksi dan menekankan aspek pengurangan Karp ini kadang-kadang terasa sedikit seperti formalisme yang tidak perlu dan mengambil waktu kelas yang tidak perlu dan perhatian siswa pada apa yang terasa seperti detail teknis yang tidak penting; itu tidak jelas mengapa kita menggunakan gagasan pengurangan yang lebih terbatas ini.
Saya benar-benar memahami perbedaan antara pengurangan Karp dan pengurangan Turing (Cook), dan bagaimana mereka mengarah pada gagasan berbeda tentang kelengkapan NP. Saya menyadari bahwa pengurangan Karp memberi kita granularitas yang lebih baik dari perbedaan antara kelas kompleksitas. Jadi, untuk studi serius tentang teori kompleksitas, pengurangan Karp jelas merupakan alat yang tepat. Tetapi bagi siswa ilmu komputer yang baru belajar ini dan tidak akan pernah masuk ke teori kompleksitas, saya tidak yakin apakah perbedaan yang lebih baik ini sangat penting bagi mereka untuk diekspos.
Akhirnya, sebagai seorang mahasiswa, saya ingat merasa bingung ketika saya menemukan masalah seperti "tautologi" - misalnya, diberikan formula boolean, periksa apakah itu tautologi. Yang membingungkan adalah bahwa masalah ini jelas sulit: algoritma waktu polinomial apa pun untuk itu akan menyiratkan bahwa; dan memecahkan masalah ini jelas sama sulitnya dengan memecahkan masalah tautologi. Namun, meskipun secara intuitif tautologi sama sulitnya dengan kepuasan, tautologi bukan NP-keras. Ya, saya mengerti hari ini mengapa ini terjadi, tetapi pada saat itu saya ingat sedang bingung dengan ini. (Apa yang terlintas di kepala saya ketika saya akhirnya mengerti adalah: Mengapa kita menggambar perbedaan antara NP-hard dan co-NP-hard, sih? Itu tampaknya buatan dan tidak termotivasi dengan baik oleh latihan. Mengapa kita lebih fokus pada NP? dari pada co-NP? Mereka tampaknya sama-sama alami. Dari perspektif praktis, co-NP-hardness pada dasarnya memiliki konsekuensi praktis yang sama dengan NP-hardness, jadi mengapa kita semua terpaku pada perbedaan ini? Ya, saya tahu jawaban, tetapi sebagai seorang siswa, saya ingat ini hanya membuat subjek merasa lebih misterius dan kurang termotivasi.)
Jadi, pertanyaan saya adalah ini. Saat kami mengajarkan kelengkapan NP kepada siswa, apakah lebih baik mengajar menggunakan pengurangan Karp atau pengurangan Turing? Adakah yang mencoba mengajarkan konsep kelengkapan NP menggunakan reduksi Turing? Jika demikian, bagaimana hasilnya? Apakah akan ada jebakan atau kerugian yang tidak jelas jika kita mengajarkan konsep menggunakan reduksi Turing, dan melewatkan masalah konseptual yang terkait dengan pengurangan Karp?
Terkait: lihat di sini dan di sini , yang menyebutkan bahwa alasan mengapa kita menggunakan pengurangan Karp dalam literatur adalah karena hal itu memungkinkan kita untuk membedakan antara kekerasan-NP dan kekerasan bersama-NP. Namun, tampaknya tidak memberikan jawaban yang berfokus pada perspektif pedagogis apakah kemampuan ini sangat penting untuk tujuan pembelajaran kelas algoritma yang harus diambil oleh setiap CS mayor. Lihat juga di sini di cstheory.SE , yang memiliki diskusi serupa.