Pada dasarnya bagaimana Anda mengetahui mana yang mungkin menjadi kasus terburuk atau terbaik Anda dan kasus "tepi" lainnya yang mungkin Anda miliki SEBELUM memilikinya dan jadi, bagaimana Anda mempersiapkan kode Anda untuk mereka?
Pada dasarnya bagaimana Anda mengetahui mana yang mungkin menjadi kasus terburuk atau terbaik Anda dan kasus "tepi" lainnya yang mungkin Anda miliki SEBELUM memilikinya dan jadi, bagaimana Anda mempersiapkan kode Anda untuk mereka?
Jawaban:
Berdasarkan konten algoritma Anda dapat mengidentifikasi struktur / tipe / konstruk data apa yang digunakan. Kemudian, Anda mencoba untuk memahami titik-titik lemah (mungkin) dari mereka dan mencoba untuk membuat rencana eksekusi yang akan membuatnya berjalan dalam kasus-kasus tersebut.
Sebagai contoh, algoritma mengambil string dan integer sebagai input dan melakukan penyortiran karakter string.
Di sini kita memiliki:
String dengan beberapa kasus khusus yang diketahui:
Integer dengan kasus khusus yang diketahui:
Mengurutkan algoritme yang dapat gagal dalam kasus batas berikut:
Kemudian, ambil semua kotak ini dan buat daftar panjang mencoba memahami bagaimana mereka tumpang tindih. Ex:
Sekarang buat test case untuk mereka :)
Ringkasan singkat : pecahkan algoritme dalam blok-blok dasar yang Anda ketahui kasus batasnya dan kemudian pasang kembali, buat kasus batas global
Saya tidak berpikir ada algoritma untuk menentukan kondisi tepi .... hanya pengalaman.
Contoh: untuk parameter byte Anda ingin menguji angka seperti 0, 127, 128, 255, 256, -1, apa pun yang dapat menyebabkan masalah.
"Edge" memiliki dua arti, dan keduanya relevan ketika datang ke edge case. Edge adalah salah satu area di mana perubahan kecil pada input mengarah ke perubahan besar pada output, atau akhir rentang.
Jadi, untuk mengidentifikasi kasus tepi suatu algoritma, saya pertama-tama melihat pada domain input. Nilai edge-nya dapat mengarah ke edge cases dari algoritma.
Kedua, saya melihat domain output, dan melihat kembali nilai input yang mungkin membuatnya. Ini lebih jarang masalah dengan algoritma, tetapi membantu menemukan masalah dalam algoritma yang dirancang untuk menghasilkan output yang mencakup domain output yang diberikan. Misalnya generator angka acak harus dapat menghasilkan semua nilai output yang diinginkan.
Akhirnya, saya memeriksa algoritme untuk melihat apakah ada kasus masukan yang serupa, namun menghasilkan keluaran yang berbeda. Menemukan case edge ini adalah yang tersulit, karena melibatkan kedua domain dan sepasang input.
Ini adalah pertanyaan yang sangat umum sehingga yang bisa saya lakukan hanyalah membuang ide-ide umum yang tidak jelas :)
-Kaji kasus batas. Ex. jika Anda menguraikan string, apa yang terjadi jika string kosong atau nol? Jika Anda menghitung dari x ke y, apa yang terjadi pada x dan y?
-Kode yang bisa disederhanakan atau KERING-ed keluar. Kompleksitas yang tidak dibutuhkan dapat menambah hal-hal yang bisa salah.
Bagian dari keterampilan menggunakan algoritma adalah mengetahui kelemahan dan kasus patologisnya. Jawaban Victor memberikan beberapa tips yang bagus, tetapi secara umum saya menyarankan Anda perlu mempelajari topik ini lebih mendalam untuk merasakan hal ini, saya tidak berpikir Anda dapat mengikuti aturan praktis untuk menjawab pertanyaan ini sepenuhnya. Misalnya melihat Cormen , atau Skiena (Skiena khususnya memiliki bagian yang sangat bagus tentang di mana menggunakan algoritma dan apa yang berfungsi dengan baik dalam kasus-kasus tertentu, Cormen masuk ke lebih banyak teori saya pikir).