Backtracking este o tehnică de programare ce explorează sistematic toate soluțiile posibile ale unei probleme, construind soluția pas cu pas și renunțând la drumurile care nu pot duce la o soluție validă (principiul „backtrack” – a da înapoi). Este esențială pentru rezolvarea problemelor de generare a permutărilor, combinațiilor și aranjamentelor.
Generarea permutărilor constă în a produce toate aranjările posibile ale unui set de n elemente (de obicei numere de la 1 la n), fiecare soluție fiind o permutare (șir de n elemente distincte). Algoritmul clasic de backtracking plasează pe fiecare poziție k din stivă (de obicei un vector soluție) un element ales dintre cele rămase, folosind un vector de frecventă pentru a marca ce elemente s-au folosit. Recursivitatea și apelul „back” (de reîncercare) sunt implementate prin metoda: pentru poziția k de la 1 la n, se încearcă toate valorile disponibile; după ce se plasează una, se apelează completarea poziției k+1; la revenire, se demarchează elementul.
Generarea combinațiilor (de n luate câte p) produce submulțimi de p elemente dintr-un set de n, fără a conta ordinea, dar menținând elementele ordonate crescător (de exemplu, pentru a evita duplicările). Backtracking-ul folosește un index de start (de exemplu, „prev” sau „min”) pentru a genera combinații strict crescătoare. Pentru fiecare poziție k, se aleg elemente mai mari decât ultimul ales, începând de la o valoare minimă (1 sau elementul anterior +1).
Astfel se garantează unicitatea combinațiilor.
Generarea aranjamentelor (de n luate câte p) diferă de combinații prin aceea că ordinea elementelor contează. Astfel, pentru fiecare poziție k se poate alege orice element din mulțime (1..n) care nu a fost folosit deja, exact ca la permutări, dar se oprește când s-au selectat p elemente (k de la 1 la p). În acest caz, vectorul de frecventă va marca elementele utilizate, iar la revenire se demarchează.
Diferențe cheie: Permutările au k=n (se folosesc toate elementele), aranjamentele au k=p (p<n), combinațiile au k=p dar elementele sunt în ordine crescătoare (nu se acceptă orice ordine).
Algoritmul backtracking are complexitate exponențială (O(n!), O(C(n,p))), fiind adecvat pentru n sau p mici (de obicei n ≤ 10-12).
Pași generali:
Această tehnică este fundamentală pentru Bacalaureat și pentru înțelegerea programării recursive.
Exemplul 2: Generarea combinațiilor de n=4 luate câte p=2
Exemplul 3: Generarea aranjamentelor de n=4 luate câte p=2
Concepte cheie: Backtracking - renunțare la soluții parțiale care nu pot fi completate, Permutări - n elemente, toate ordonările posibile, n! soluții, Combinații - submulțimi de p elemente din n, ordinea nu contează, C(n,p) soluții, Aranjamente - n luate câte p, ordinea contează, fără repetiții, A(n,p) = n!/(n-p)! soluții, Stivă (vector soluție) și vector de frecvență, Parametru de start pentru combinații (evitare duplicare), Recursivitate și demarcare (backtrack) la revenire, Complexitate exponențială – aplicabil pentru n sau p mici
Vrei exerciții pe lecția asta + AI care te ajută pas cu pas?
Cont gratuit — 20 întrebări AI/zi, exerciții nelimitate.