Untuk mencoba menguji apakah suatu algoritma untuk beberapa masalah sudah benar, titik awal yang biasa adalah mencoba menjalankan algoritme dengan tangan pada sejumlah kasus uji sederhana - cobalah beberapa contoh contoh masalah, termasuk beberapa "kasus sudut" sederhana. ". Ini adalah heuristik yang hebat: ini adalah cara yang bagus untuk dengan cepat menyingkirkan banyak upaya yang salah pada suatu algoritma, dan untuk mendapatkan pemahaman tentang mengapa algoritma tidak bekerja.
Namun, ketika mempelajari algoritma, beberapa siswa tergoda untuk berhenti di situ: jika algoritme mereka bekerja dengan benar pada beberapa contoh, termasuk semua kotak sudut yang dapat mereka coba pikirkan, maka mereka menyimpulkan bahwa algoritme itu harus benar. Selalu ada siswa yang bertanya: "Mengapa saya perlu membuktikan algoritme saya dengan benar, jika saya bisa mencobanya pada beberapa kasus uji?"
Jadi, bagaimana Anda menipu heuristik "coba beberapa kasus uji"? Saya mencari beberapa contoh bagus untuk menunjukkan bahwa heuristik ini tidak cukup. Dengan kata lain, saya mencari satu atau lebih contoh dari suatu algoritma yang secara dangkal tampak seperti itu mungkin benar, dan yang menghasilkan jawaban yang tepat pada semua input kecil yang mungkin muncul dengan siapa pun, tetapi di mana algoritma tersebut sebenarnya tidak bekerja Mungkin algoritma hanya bekerja dengan benar pada semua input kecil dan hanya gagal untuk input besar, atau hanya gagal untuk input dengan pola yang tidak biasa.
Secara khusus, saya mencari:
Algoritma. Cacat harus berada pada level algoritmik. Saya tidak mencari bug implementasi. (Misalnya, minimal, contohnya harus agnostik bahasa, dan kelemahannya harus lebih terkait dengan masalah algoritme daripada masalah rekayasa perangkat lunak atau implementasi.)
Algoritma yang mungkin masuk akal bagi seseorang. Pseudocode harus terlihat setidaknya masuk akal benar (misalnya, kode yang dikaburkan atau jelas meragukan bukan contoh yang baik). Poin bonus jika ini adalah algoritma yang benar-benar dibuat oleh beberapa siswa ketika mencoba menyelesaikan pekerjaan rumah atau masalah ujian.
Algoritma yang akan melewati strategi uji manual yang masuk akal dengan probabilitas tinggi. Seseorang yang mencoba beberapa kasus uji kecil dengan tangan seharusnya tidak mungkin menemukan kekurangannya. Misalnya, "mensimulasikan QuickCheck dengan tangan pada selusin kasus uji kecil" seharusnya tidak akan mengungkapkan bahwa algoritma tersebut salah.
Lebih disukai, algoritma deterministik. Saya telah melihat banyak siswa berpikir bahwa "coba beberapa kasus uji dengan tangan" adalah cara yang masuk akal untuk memeriksa apakah algoritma deterministik benar, tetapi saya menduga sebagian besar siswa tidak akan menganggap bahwa mencoba beberapa kasus uji adalah cara yang baik untuk memverifikasi probabilistik algoritma. Untuk algoritma probabilistik, seringkali tidak ada cara untuk mengetahui apakah ada output tertentu yang benar; dan Anda tidak dapat menggunakan cukup banyak contoh tangan untuk melakukan tes statistik apa pun yang berguna pada distribusi keluaran. Jadi, saya lebih suka fokus pada algoritma deterministik, karena mereka menjadi lebih bersih ke jantung kesalahpahaman siswa.
Saya ingin mengajarkan pentingnya membuktikan algoritme Anda dengan benar, dan saya berharap menggunakan beberapa contoh seperti ini untuk membantu memotivasi bukti kebenaran. Saya lebih suka contoh yang relatif sederhana dan dapat diakses oleh mahasiswa; contoh yang membutuhkan mesin berat atau satu ton latar belakang matematika / algoritme kurang berguna. Juga, saya tidak ingin algoritma yang "tidak alami"; Meskipun mungkin mudah untuk membuat beberapa algoritma buatan aneh untuk mengelabui heuristik, jika terlihat sangat tidak alami atau memiliki backdoor yang jelas dibangun hanya untuk menipu heuristik ini, mungkin tidak akan meyakinkan siswa. Adakah contoh yang bagus?