Bagaimana Anda mengidentifikasi kasus "tepi" pada algoritma?


25

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?


2
Alternatif: bila memungkinkan, saya penggemar berat pengujian fuzzy. Sungguh menakjubkan bagaimana banyaknya input yang dihasilkan secara acak dapat menemukan bug dalam suatu fungsi yang tidak diketahui jumlah pemeriksaan / pengujian tepi. Keduanya bekerja sangat baik bersama-sama ... dan mereka jelas dilengkapi dengan kesalahan pendataan secara akurat ketika menjalankan input "benar" :)
Matthieu M.

Jawaban:


28

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:

  • String kosong
  • Benang panjang
  • String Unicode (karakter khusus)
  • Jika terbatas pada serangkaian karakter tertentu, apa yang terjadi ketika beberapa tidak berada dalam jangkauan
  • String panjang aneh / genap
  • Null (sebagai argumen)
  • Non-null diakhiri

Integer dengan kasus khusus yang diketahui:

  • 0
  • Min / Maks
  • Negatif positif

Mengurutkan algoritme yang dapat gagal dalam kasus batas berikut:

  • Masukan kosong
  • 1 input elemen
  • Input sangat panjang (mungkin panjang maks (tipe data yang digunakan untuk indeks))
  • Sampah di dalam koleksi yang akan disortir
  • Masukan kosong
  • Elemen rangkap
  • Koleksi dengan semua elemen sama
  • Input panjang ganjil / genap

Kemudian, ambil semua kotak ini dan buat daftar panjang mencoba memahami bagaimana mereka tumpang tindih. Ex:

  • Kasing tali kosong mencakup kasing koleksi kosong
  • String kosong == koleksi nol
  • dll.

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


5
Satu hal lagi untuk ditambahkan. . . menganalisis kode dan mencari kasus khusus dalam kode. Jika pengembang menangani 0 hingga 13 secara berbeda dari 14 dan lebih besar - mungkin dev menggunakan algoritme yang berbeda untuk nilai kecil dan besar untuk alasan kinerja - Anda memiliki casing tepi di 13 dan 14. +1 untuk daftar hebat.
Ethel Evans

2

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.


2

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


0

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.


0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.