Algoritmalardaki “kenar” durumları nasıl tanımlarsınız?


25

Temel olarak, en kötü ya da en iyi durumun hangileri olabileceğini ve bunlardan önce ÖNCE sahip olabileceğiniz diğer "son" vakaların nasıl olduğunu nasıl öğrenirsiniz?


2
Alternatif: Mümkün olduğunda, bulanık testlerin büyük bir hayranıyım. Rastgele oluşturulmuş girdilerin büyük kütlesinin, hiçbir inceleme / kenar testi miktarının ortaya çıkmadığı bir fonksiyon içinde böcekleri nasıl tespit edebileceği şaşırtıcı. Bu ikisi birlikte gerçekten iyi çalışıyorlar ... ve açıkça "doğru" girdilerle çalışırken hataları doğru bir şekilde günlüğe kaydederek tamamlanıyorlar :)
Matthieu M.

Yanıtlar:


28

Algoritmanın içeriğine bağlı olarak hangi veri yapılarının / türlerinin / yapılarının kullanıldığını tanımlayabilirsiniz. Daha sonra, bunların (olası) zayıf noktalarını anlamaya ve bu durumlarda çalışmasını sağlayacak bir yürütme planı oluşturmaya çalışıyorsunuz.

Örneğin, algoritma girdi olarak bir dizge ve bir tamsayı alır ve dizenin karakterlerini sıralar.

İşte biz var:

Bazı özel durumlarla birlikte dize :

  • Boş dize
  • Uzun dize
  • Unicode string (özel karakterler)
  • Belirli bir karakter grubuyla sınırlıysa, bazıları aralıkta değilse ne olur?
  • Tek / çift uzunluklu dize
  • Boş (bağımsız değişken olarak)
  • Boş olmayan sonlandırıldı

Bilinen özel durumlara sahip tamsayı :

  • 0
  • Min / maxlnt
  • Negatif pozitif

Aşağıdaki sınır durumlarında başarısız olabilecek sıralama algoritması :

  • Boş giriş
  • 1 eleman girişi
  • Çok uzun giriş (belki maksimum uzunluk (indeks için kullanılan veri tipi))
  • Sıralanacak koleksiyonun içindeki çöp
  • Boş giriş
  • Yinelenen öğeler
  • Tüm elemanların eşit toplanması
  • Tek / çift uzunluk girişi

Ardından, tüm bu davaları alın ve bunların nasıl çakıştığını anlamaya çalışan uzun bir liste oluşturun. Ör:

  • Boş dize kılıfı boş toplama kılıfını kapsar
  • Boş dize == boş koleksiyon
  • vb.

Şimdi onlar için test senaryoları oluşturun :)

Kısa özet : algoritmayı, sınır durumlarını bildiğiniz temel bloklara böler ve sonra bunları birleştirerek küresel sınır durumları yaratabilir


5
Eklenecek bir şey daha var. . . kodu analiz edin ve koddaki özel durumları arayın. Eğer geliştirici, 0'dan 13'e 14'ten ve üzerinde farklı şekilde işlerse - belki de dev, performans nedenlerinden dolayı küçük ve büyük değerler için farklı algoritmalar kullanıyor - harika liste için 13 ve 14'te kenar durumları var.
Ethel Evans

2

Kenar koşullarını belirleyen bir algoritma olduğunu sanmıyorum .... sadece deneyim.

Örnek: Bir bayt parametresi için 0, 127, 128, 255, 256, -1 gibi sayıları test etmek isteyebilirsiniz, sorun yaratabilecek herhangi bir şey.


2

Bir "kenar" iki anlama sahiptir ve her ikisi de kenar davaları söz konusu olduğunda birbiriyle ilgilidir. Kenar, girdideki küçük bir değişikliğin çıktıda büyük bir değişikliğe neden olduğu bir alandır veya bir aralığın sonuna gelir.

Dolayısıyla, bir algoritmanın son durumlarını tanımlamak için önce giriş alanına bakarım. Kenar değerleri algoritmanın kenar durumlarına yol açabilir.

İkincisi, çıktı alanına bakarım ve onları yaratabilecek girdi değerlerine bakarım. Bu daha az yaygın bir şekilde algoritmalar ile ilgili bir problemdir, ancak verilen bir çıktı alanını kapsayan çıktı üretmek için tasarlanmış algoritmalardaki problemleri bulmanıza yardımcı olur. Örneğin, bir rasgele sayı üreticisi, amaçlanan tüm çıktı değerlerini üretebilmelidir.

Son olarak, benzer olan ancak benzer olmayan çıktılara yol açan girdi durumları olup olmadığını görmek için algoritmayı kontrol ediyorum. Bu kenar durumları bulmak en zorudur, çünkü hem alanları hem de bir çift girişi içerir.


0

Bu çok genel bir sorudur, yapabileceğim tek şey bazı genel ve belirsiz fikirleri ortaya koymak :)

-Açık sınırı davaları. Ör. Bir dizgiyi ayrıştırıyorsanız, dizge boş veya boşsa ne olur? Eğer x'den y'ye kadar sayıyorsanız, x ve y'de ne olur?
-Kodlaştırılmış veya KURUTMALI olabilir. Gereksiz bir karmaşıklık, yanlış gidebilecek şeylere katkıda bulunabilir.


0

Algoritma kullanma becerisinin bir kısmı zayıf yönlerini ve patolojik durumlarını bilmektir. Victor'un cevabı bazı iyi ipuçları veriyor, ancak genel olarak, bunun hakkında bir fikir edinmek için konuyu daha derinlemesine incelemeniz gerektiğini tavsiye ediyorum, bu soruyu tam olarak cevaplamak için kurallara uyabileceğinizi sanmıyorum. Örneğin , Cormen veya Skiena'ya bakınız (özellikle Skiena algoritmaların nerede kullanılacağı ve belirli durumlarda neyin iyi çalıştığı konusunda çok iyi bir bölüme sahiptir, Cormen sanırım daha fazla teoriye giriyor).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.