ALGO25 / BLOG

Testare diferențială: compară cu o soluție simplă

Verifică un algoritm eficient pe intrări mici folosind o soluție de referință independentă. Păstrează cazul care diferă și redu-l până devine explicabil.

Testarea diferențială compară rezultatele a două implementări pentru aceeași intrare. În problemele de algoritmică, una poate fi o soluție simplă, lentă, dar ușor de verificat pe cazuri mici. Cealaltă este soluția eficientă pe care vrei să o verifici.

Referința trebuie să fie independentă

Pentru o problemă de perechi, referința poate încerca toate perechile, iar soluția rapidă poate folosi sortare și două poziții mobile. Dacă ambele programe copiază aceeași idee și aceeași eroare, acordul dintre ele oferă mai puțină încredere.

Verifică manual referința pe câteva exemple înainte să o tratezi ca reper. Un rezultat diferit arată o neconcordanță, dar nu spune automat care implementare este greșită. Enunțul și verificarea independentă decid.

Generează cazuri în limitele contractului

Folosește dimensiuni mici pentru care soluția lentă termină repede. Include valori egale, zero, extreme permise și ordine diferite. Dacă algoritmul presupune date sortate, generatorul sau pregătirea testului trebuie să respecte această precondiție.

Intrările aleatoare completează cazurile construite intenționat, nu le înlocuiesc. Un generator care alege numai valori pozitive nu va descoperi o eroare care apare numai la numere negative, dacă acestea sunt permise de problemă.

Aceeași intrare validă este dată soluției simple și celei rapide. Dacă rezultatele diferă, păstrăm intrarea și o reducem, verificând care rezultat respectă enunțul.Aceeași intrare validă este dată soluției simple și celei rapide. Dacă rezultatele diferă, păstrăm intrarea și o reducem, verificând care rezultat respectă enunțul.Mărește schema ↗

Păstrează primul caz care diferă

Salvează intrarea exactă, rezultatul fiecărei implementări și parametrul de reproducere al generatorului, dacă folosești unul. Acest parametru, numit seed, permite repetarea aceleiași succesiuni pseudoaleatoare în condițiile stabilite de generator.

Nu continua doar să numeri eșecurile fără să păstrezi un exemplu. Un singur caz mic și reproductibil poate explica eroarea mai bine decât mii de rezultate diferite fără intrările lor.

Redu exemplul fără să pierzi eroarea

Încearcă să elimini elemente sau să micșorezi valori, păstrând intrarea validă și diferența dintre rezultate. Scopul este să ajungi la un contraexemplu pe care îl poți urmări manual. Reducerea trebuie să reverifice după fiecare schimbare că eroarea încă apare.

Pentru probleme cu mai multe răspunsuri corecte, nu compara orbește textele ieșirii. Verifică proprietățile soluției și valoarea obiectivului cerut. Două construcții diferite pot fi ambele valide.

Testele nu înlocuiesc demonstrația de corectitudine și analiza limitelor maxime. Ele oferă cazuri concrete care pot respinge rapid o implementare greșită și pot deveni teste de regresie după corectare.

Continuă cu complexitatea, căutarea binară și metoda backtracking.

Întrebări frecvente

Ce este testarea diferențială?

Compararea rezultatelor a două implementări pentru aceleași intrări. În algoritmică, o soluție simplă pentru cazuri mici poate servi ca referință pentru varianta optimizată.

Ce fac când soluția rapidă diferă de soluția brută?

Salvează intrarea, verifică independent răspunsul și redu cazul păstrând diferența. Poate fi greșită oricare implementare; un caz mic permite identificarea exactă a presupunerii încălcate.

Multe teste aleatoare demonstrează corectitudinea?

Nu. Ele pot descoperi contraexemple, dar nu acoperă automat toate cazurile. Combină-le cu teste limită deliberate, rezultate independente și un argument de corectitudine al algoritmului.