|
Stiva este acea form? de organizare a datelor (structur? de date) cu proprietatea c? opera?iile de introducere ?i scoatere a datelor se fac în vârful ei.¬
Stivele se pot simula utilizând vectori.
Fie ST(i) un vector. ST(1), ST(2), ..., ST(n) pot re?ine numai litere sau numai cifre. O variabil? K indic? în permanent? vârful stivei.
Exemplific?m, în continuare, modul de lucru cu stiva:
În stiva ini?ial vid? se introduce litera A, vârful stivei va fi la nivelul 1 (k-1);
introducem în stiv? litera B, deci k va lua valoarea 2;
scoatem din stiv? pe B (A nu poate fi scos);
scoatem din stiv? pe A; stiva r?mâne vid?
În mod practic la scoaterea unei variabile din stiv?, scade cu 1 valoarea variabilei ce indic? vârful stivei, iar atunci când scriem ceva în stiv?, o eventual? valoare rezidual? se pierde:
Pe un anumit nivel se retine, de regul?, o singur? informa?ie (liter? sau cifr?), îns? este posibil; a?a cum va rezulta din exemplele, prezentate în lucrare, s? avem mai multe informa?ii, caz în care avem de a face cu stive duble, triple, etc.
Întreaga teorie a recursivit??ii se bazeaz? pe structura de tip stiv?.
Prezentarea tehnicii Backtracking
Aceast? tehnic? se folose?te în rezolvarea problemelor care îndeplinesc simultan urm?toarele condi?ii:
- solu?ia lor poate fi pus? sub forma unui vector S=x1,x2, ...,xn, cu x1 € A1,
x2 € A2 …,xn € An
- mul?imile A1, A2 , …., An sunt mul?imi finite, iar elementele lor se consider? c? se afl? într-o rela?ie de ordine bine stabilit?;
- nu se dispune de o alt? metod? de rezolvare, mai rapid?
- x1 x2 …, xn pot fi la rândul lor vectori;
- A1, A2 …, An pot coincide.
La întâlnirea unei astfel de probleme, dac? nu cunoa?tem aceast? tehnic?, suntem tenta?i s? gener?m toate elementele produsului cartezian A1,A2 …,An si fiecare element s? fie testat dac? este solu?ie. Rezolvând problema în acest mod, timpul de execu?ie este atât de mare, încât poate fi considerat infinit, algoritmul neavând nici o valoare practic?.
De exemplu, dac? dorim s? gener?m toate permut?rile unei mul?imi finite A, nu are rost s? gener?m produsul cartezian AxAx.....xA, pentru ca apoi, s? test?m, pentru fiecare element al acestuia, dac? este sau nu permutare (nu are rost s? gener?m 1.1,1.......1, pentru ca apoi s? constat?m c? nu am ob?inut o permutare, când de la a doua cifr? 1 ne puteam da seama c? cifrele nu sunt distincte).
Tehnica Backtracking are la baz? un principiu extrem de simplu:
- se construie?te solu?ia pas cu pas: x1, x2 …,xn
- dac? se constat? c?, pentru o valoare aleas?, nu avem cum s? ajungem la solu?ie, se renun?? la acea valoare ?i se reia c?utarea din punctul în care am r?mas.
Concret:
- se alege primul element x, ce apar?ine lui A;
- presupunând generate elementele x1,x2 …,xk , apar?inând mul?imilor A1,
A2 …,Ak , se alege (dac? exist?) xk+1 , primul element disponibil din mul?imea Ak+1 , apar dou? posibilit??i :
1) Nu s-a g?sit un astfel de element, caz în care caz în care se reia c?utarea considerând generate elementele x1,x2 …,xk+1 , iar aceasta se reia de la urm?torul element al mul?imii Ak r?mas netestat;
2) A fost g?sit, caz în care se testeaz? dac? acesta îndepline?te anumite condi?ii de continuare ap?rând astfel dou? posibilit??i:
- îndepline?te, caz în care se testeaz? dac? s-a ajuns la solu?ie si apar din nou dou? posibilit??i
- s-a ajuns la solu?ie, se tip?re?te solu?ia si se reia algoritmul considerând generate elementele x1,x2 …,xk , (se caut? în continuare, un alt element al mul?imii Ak , r?mas netestat);
- nu s-a ajuns la solu?ie, caz în care se reia algoritmul considerând generate elementele x1,x2 …,xk , si se caut? un prim element xk+2 € Ak.
- nu le îndepline?te caz în care se reia algoritmul considerând generate elementele x1,x2 …,xk , iar elementul xk-1 se caut? între elementele mul?imii A, r?mase netestate.
Algoritmii se termin? atunci când nu exist? nici un element x1 € A1 netestat.
Observa?ie: tehnica Backtracking are ca rezultat ob?inerea tuturor solu?iilor problemei. În cazul în care se cere o sigur? solu?ie se poate for?a oprirea, atunci când a fost g?sit?.
Am ar?tat c? orice solu?ie se genereaz? sub form? de vector. Vom considera c? generarea solu?iilor se face intr-o stiv?. Astfel, x1 € A1, se va g?si pe primul nivel al stivei, x2 € A2 se va g?si pe al doilea nivel al stivei,... xk € Ak se va g?si pe nivelul k al stivei. În acest fel, stiva (notat? ST) va ar?ta astfel:
ST
Nivelul k+1 al stivei trebuie ini?ializat (pentru a alege, în ordine, elementele mul?imii k+1 ). Ini?ializarea trebuie f?cut? cu o valoare aflat? (în rela?ia de ordine considerat?, pentru mul?imea Ak+1 ) înaintea tuturor valorilor posibile din mul?ime. De exemplu, pentru generarea permut?rilor mul?imii {1,2.....n}, orice nivel al stivei va lua valori de la 1 la n. Ini?ializarea unui nivel (oarecare) se face cu valoarea 0. Procedura de ini?ializare o vom numi INIT ?i va avea doi parametri: k (nivelul care trebuie ini?ializat si ST (stiva)).
G?sirea urm?torului element al mul?imii Ak (element care a fost netestat) se face cu ajutorul procedurii SUCCESOR (AS,ST,K). Parametrul AS (am succesor) este o variabil? boolean?. În situa?ia în care am g?sit elementul, acesta este pus în stiv? ?i AS ia valoarea TRUE, contrar (nu a r?mas un element netestat) AS ia valoarea FALSE..
Odat? ales un element, trebuie v?zut dac? acesta îndepline?te condi?iile de continuare (altfel spus, dac? elementul este valid). Acest test se face cu ajutorul procedurii VALID (EV,ST,K).
Testul dac? s-a ajuns sau nu la solu?ia final? se face cu ajutorul func?iei SOLUTIE(k) iar o solu?ie se tip?re?te cu ajutorul procedurii TIPAR. Prezent?m în continuare rutina Backtracking:
k:=1; init(1,st);
while k>0 do begin
repeat succesor (as, st, k) ; .
if as then valid(ev,st,k)
|