Documente Academic
Documente Profesional
Documente Cultură
Prezentarea metodei
1. Când se utilizează metoda backtracking ?
În continuare, este prezentat un exemplu de problemă care poate fi rezolvat prin utilizarea
tehnicii backtracking.
Generarea permutărilor. Se citeşte un număr natural n. Să se genereze toate permutările
mulţimii {1,2,...,n}. De exemplu, pentru n=3, permutările mulţimii {1,2,3} sunt
prezentate alăturat.
123
132
213
231
312
321
Pentru această problemă, A1=A2=A3={1,2,3}. Fie permutarea 213. Ea este scrisă sub
formă de vector, unde 2∈A1, 1∈A2 şi 3∈A3.
2. Principiul care stă la baza metodei backtracking
Principiul care stă la baza metodei backtracking va fi prezentat printr-un exemplu, acela al
generării permutărilor. Cum se poate rezolva această problemă?
O primă soluţie ar fi să generăm toate elementele produsului cartezian:
{1,2,3}×{1,2,3}×{1,2,3}={11, 12, 13, 21, 22, 23, 31, 32, 33}
×{1,2,3}= {111, 112, 113, 121, 122, 123, 131, 132, 133, 211, 212,
213, 221, 222, 223, 231, 232, 233, 311, 312, 313, 321, 322, 323,
331, 332, 333}.
Apoi, urmează să vedem care dintre elementele acestui produs cartezian sunt permutări,
adică să conţină numai numere distincte. Astfel, 111, 112… nu sunt permutări, dar 123
este permutare, ş.a.m.d. Produsul cartezian are 27 de elemente şi dintre ele, doar 6 sunt
permutări. În general, produsul cartezian are nn elemente, din care permutări sunt doar n!.
Vă daţi seama că un astfel de algoritm de generare a permutărilor este ineficient…
Întrebarea este dacă problema nu se poate rezolva eficient? Să observăm că nu are rost
să generăm un element al produsului cartezian pentru ca apoi, să ne dăm seama că nu
este permutare, deoarece nu este alcătuit din numere distincte. De exemplu, dacă la un
pas al algoritmului am generat 22, e clar că nu se poate obţine o permutare, oricare ar fi
numărul care urmează pe poziţia 3.
Principiul metodei
Observaţi faptul că după ce am analizat posibilele valori pe care le poate lua componenta
k, avem două posibilităţi: ori trecem la componenta k+1 (facem pasul înainte), ori
mergem la componenta k-1 (facem pasul înapoi).
Nu există permutări care încep cu 1,1, motiv pentru care, pentru aceeaşi componentă,
vom reţine valoarea următoare,
adică 2. Întrucât există permutări care încep cu 1,2, vom trece la elementul 3 (înainte).
1 2 1
Nu există permutări care sunt de forma 1,2,1, motiv pentru care aceeaşi componentă
va reţine numărul următor, 2.
1 2 2
Nu există permutări care sunt de forma 1,2,2, motiv pentru care aceeaşi componentă
va memora numărul următor, adică 3. Am obţinut deja o primă soluţie şi o afişăm.
1 2 3
Pentru componenta 3, nu există o altă valoare pe care o putem utiliza. Din acest motiv,
vom trece la elementul 2, (înapoi). Componenta 2 are deja memorată valoarea 2. Alegem
valoarea următoare, 3. Întrucât există permutări care încep cu 1,3, vom trece la elementul
următor, 3 (înainte).
1 3
1 3 1
1 3 2
Prima valoare care poate fi memorată este 1. Întrucât nu există permutări de forma
1,3,1 trecem la valoarea
următoare 2. Dar 1,3,2 este soluţie şi o afişăm.
...
Algoritmul continuă până când se ajunge la componenta de indice 0. În acel moment,
au fost deja afişate toate permutările.