it-swarm.asia

Algoritmalardaki "Edge" vakalarını nasıl tanımlıyorsunuz?

Temel olarak hangisinin en kötü veya en iyi durumunuz olabileceğini ve bunlara sahip OLMADAN ÖNCE sahip olabileceğiniz diğer "Edge" vakalarını nasıl bulabilir ve kodunuzu onlar için nasıl hazırlayabilirsiniz?

27
Luis Armando

Algoritmanın içeriğine bağlı olarak hangi veri yapılarının/türlerinin/yapılarının kullanıldığını belirleyebilirsiniz. Sonra, bunların (olası) zayıf noktalarını anlamaya ve bu durumlarda çalışmasını sağlayacak bir icra planı bulmaya çalışıyorsunuz.

Örneğin, algoritma girdi olarak bir dize ve bir tam sayı alır ve dizenin karakterlerinin bir tür sıralamasını yapar.

İşte burada:

String bilinen bazı özel durumlarda:

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

Tamsayı bilinen özel durumlar ile:

  • Min/maxlnt
  • Negatif pozitif

Sıralama algoritması, aşağıdaki sınır durumlarda başarısız olabilir:

  • Boş giriş
  • 1 eleman girişi
  • Çok uzun giriş (belki maksimum uzunluk (dizin için kullanılan veri türü))
  • Koleksiyonun içindeki sıralanacak çöp
  • Boş giriş
  • Yinelenen öğeler
  • Tüm öğeler eşit olarak toplama
  • Tek/çift uzunluk girişi

Ardından, tüm bu durumları ele alın ve nasıl üst üste geldiğini anlamaya çalışan uzun bir liste oluşturun. Ör:

  • Boş dize kasası boş toplama kasasını kapsar
  • Null string == null koleksiyonu
  • vb.

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

Kısa özet: algoritmayı sınır durumlarını bildiğiniz temel bloklarda kırın ve ardından bunları yeniden birleştirin ve global sınır vakaları oluşturun

30

"Edge" in iki anlamı vardır ve Edge vakaları söz konusu olduğunda her ikisi de geçerlidir. Kenar, girişteki küçük bir değişikliğin çıktıda büyük bir değişikliğe yol açtığı bir alandır veya bir aralığın sonudur.

Bu nedenle, bir algoritmanın Edge örneklerini tanımlamak için önce girdi alanına bakarım. Edge değerleri algoritmanın Edge durumlarına yol açabilir.

İkincisi, çıktı alanına bakıyorum ve onları yaratabilecek giriş değerlerine tekrar bakıyorum. Bu, algoritmalarda daha az görülen bir sorundur, ancak belirli bir çıktı alanına yayılan çıktı üretmek için tasarlanmış algoritmalarda sorunların bulunmasına yardımcı olur. Örneğin. rastgele sayı üretecinin amaçlanan tüm çıktı değerlerini üretebilmesi gerekir.

Son olarak, benzer, ancak farklı çıktılara yol açan giriş durumları olup olmadığını görmek için algoritmayı kontrol ediyorum. Bu Edge vakalarını bulmak en zordur, çünkü hem alan adlarını hem de bir çift girişi içerir.

2
MSalters

Edge koşullarını belirlemek için herhangi bir algoritma olduğunu sanmıyorum .... sadece deneyim.

Örnek: bir bayt parametresi için 0, 127, 128, 255, 256, -1 gibi sayıları, soruna neden olabilecek herhangi bir şeyi test etmek istersiniz.

2
Steve Wellens

Bu çok genel bir soru, bu yüzden tek yapabileceğim bazı genel, belirsiz fikirler atmak :)

-Sınır sınır davaları. Ör. bir dizeyi ayrıştırırsanız, dize boş veya null olursa ne olur? X'den y'ye sayıyorsanız, x ve y'de ne olur?
- Basitleştirilmiş veya D.R.Y.-ed. Gereksiz herhangi bir karmaşıklık, yanlış gidebilecek şeylere katkıda bulunabilir.

0
seand

Algoritma kullanma becerisinin bir kısmı zayıflıklarını ve patolojik vakalarını bilmektir. Victor'un cevabı bazı iyi ipuçları veriyor, ancak genel olarak, bunu hissetmek için konuyu daha derinlemesine incelemenizi tavsiye ederim, bu soruyu tam olarak cevaplamak için başparmak kurallarını takip edebileceğinizi düşünmüyorum. Örneğin. bkz. Cormen veya Skiena (Özellikle Skiena, algoritmaların nerede kullanılacağı ve bazı durumlarda neyin iyi çalıştığı konusunda çok iyi bir bölüme sahiptir, Cormen daha fazla teoriye girer) .

0
Steve