Presentation is loading. Please wait.

Presentation is loading. Please wait.

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.

Similar presentations


Presentation on theme: "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."— Presentation transcript:

1

2 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. K 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.

3 B A 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); B 2 1 Introducem în stivă litera B, deci k = 2; A Scoatem din stivă pe B (A nu poate fi scos); k=1 Scoatem din stivă pe A; stiva rămâne vidă; k=0 Î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 numar), însă este posibil; aşa cum va rezulta din exemple, 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ă.

4 Studiu de caz: - Problema reginelor
Fiind data o tabla de sah nxn, se cer toate solutiile de aranjare a n regine, astfel incat sa nu se afle doua regine pe aceeasi linie, coloana sau diagonala (reginele sa nu se atace reciproc).

5 R R R R R R R R R R R R R R R Exemplu:
Presupunand ca dispunem de o tabla de dimensiune 4x4 Observam ca o regina trebuie sa fie plasata singura pe linie. Plasam prima regina pe linia 1 coloana 1. R R R R R A doua regina nu poate fi asezata decat in coloana a 3-a. R R R R R R Observam ca a treia regina nu poate fi plasata in linia a 3-a. R R R R Incercam atunci plasarea celei de-a doua regine in coloana a 4-a. A treia regina nu poate fi plasata decat in coloana a 2-a. In aceasta situatie regina a patra nu mai poate fi asezata.

6 Incercand sa avansam cu regina a treia, observam ca nu este posibil sa o plasam nici in coloana a 3-a, nici in coloana a 4-a, deci o vom scoate de pe tabla. R R R R R R R Regina a doua nu mai poate avansa, deci si ea este scoasa de pe tabla. R R R R Avansam cu prima regina in coloana a 2-a. R R R A doua regina nu poate fi asezata decat in coloana a 4-a. Regina a treia se aseaza in prima coloana. Algoritmul continua in acest mod pana cand trebuie scoasa de pe tabla prima regina. Acum este posibil sa plasam a patra regina in coloana a 3-a si astfel am obtinut o solutie a problemei.

7 Analizind algoritmul de dispunere a damelor pe tabla, observam:
fiecare regina a fost plasata in alta linie reginele au fost plasate pe tabla pe rind, fiecare pe linia ei fiecare regina a fost plasata pe linia ei incepind din coloana 1 pina in coloana care asigura neatacul cu alte regine puse deja pe tabla daca o regina nu mai avea unde sa fie amplasata, se revenea la regina de pe linia anterioara si se incearca amplasarea in coloanele urmatoare celei in care se afla regina in momentul revenirii

8 Putem codifica solutia sub forma de vector st[i],i=1
Putem codifica solutia sub forma de vector st[i],i=1...n, ale carui elemente reprezinta coloana in care se gaseste regina din linia i. Tabla de sah are n coloane; deci st[i] €{1,…n} , i=1,n. Prin urmare trebuie gasita o submultime a {1...n}X{1...n} cu proprietatea ca reginele din liniile 1...n si coloanele st[1], st[2]...st[n] nu se ataca. Conditiile interne si de continuare: Neatacul pe coloane : st[i]=st[k], i=1,k-1 Neatacul pe diagoanla |st(i)-st(k)|=|i-k|, i=1,k-1 Metoda prin care au fost dispuse reginele pe tabla se numeste BACKTRACKING – cautare cu revenire, generarea unei solutii se face pe baza urmelor precedente Aplicarea metodei presupune: - codificarea solutiilor – determinarea semnificatiei elementelor st[i]si stabilirea multimilor in care se pot gasi solutiile Ai - determinarea conditiilor interne si a celor de continuare - implementarea algoritmului

9 BACKTRACKING Metoda de programare care se aplica pentru rezolvarea problemelor in care se cer solutiile care indeplinesc anumite conditii interne.

10 Necesitate: Deseori în practică trebuie să rezolvăm probleme care au un număr foarte mare de soluţii posibile. De cele mai multe ori însă, nu ne interesează toate soluţiile, ci numai o parte dintre ele numite solutii rezultat, care îndeplinesc anumite condiţii specifice problemei, denumite conditii interne. Pentru astfel de probleme este indicată folosirea metodei backtracking care evită generarea soluţilor inutile.Valorile admise in solutia rezultat se numesc valori valide. Conditiile de validare sunt deduse din conditiile interne. Utilizarea metodei: se foloseşte în rezolvarea problemelor care îndeplinesc simultan următoarele condiţii: soluţia poate fi pusă sub forma unui vector st[i]=(x1,x2,..., xn) , cu xi € Ai , i=1,n; 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ă; Observaţii: nu pentru toate problemele n este cunoscut de la început; x1, x2,..., xn pot fi la rândul lor vectori; în multe probleme, mulţimile A1, A2,..., An coincid; tehnica backtracking are ca rezultat obţinerea tuturor soluţiilor problemei. În cazul în care se cere o singură soluţie se poate forţa oprirea atunci când a fost găsită.

11 Principiul care stă la baza metodei backtracking:
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.

12 1.la fiecare pas K pornim de la o solutie partiala st=( x1, x2 …,xk) determinata pina in acel moment si incercam sa extindem aceasta solutie adaugind un nou element la sfirsitul vectorului. 2. cautam in multimea AK+1, un nou 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 -a) s-a ajuns la soluţie, se tipăreşte soluţia si se reia algoritmul considerând generate elementele x1 ,x 2 …,x k , (se caută în continuare, un alt element al mulţimii Ak , rămas netestat); -b) 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 x k-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.

13 Revenim la problema reginelor :Pentru reprezentarea unei soluţii putem folosi un vector ST cu n componente (având în vedere că pe fiecare linie se găseşte o singură regină). vectorul poate fi asimilat unei stive. În general ST(i)=k semnifică faptul că pe linia i regina ocupă poziţia k. lată algoritmul, conform strategiei generate de backtracking: Am coborât în stivă mutând regina de pe linia 2 şi coloana 3 în coloana 4. ST(4) ST(3) ST(2) ST(1) - Reginele de pe 2-3 se găsesc pe aceeaşi diagonală. (|st(3)-st(2)|=|4-3|); - Reginele de pe 2-3 se găsesc pe aceeaşi coloană. (st[2]=st[3]) - Şi această încercare eşuează întrucât reginele de pe 2 şi 3 sunt pe aceeaşi diagonală. (|st(3)-st(2)|=|2-3|); Nu se poate plasa regina 3 în coloana 1, întrucât în liniile 1-3 reginele ocupa acelaşi coloană.(st[1]=st[3]) ….. …. Algoritmul se încheie atunci când stiva este vidă. 3 4 1 2 Aşezarea damei 2 în coloana 3 este posibilă 3 2 4 1 În linia 2 se încearcă aşezarea damei în coloana 2 , însă acest lucru nu este posibil, pentru că damele se găsesc pe aceiaşi diagonală (|st(1)-st(2)|=|1-2|); . Linia 2 se încearcă aşezarea damei în coloana 1, acest lucru nefiind posibil întrucât avem doua regine pe aceeaşi coloană. 1 - În prima poziţie a stivei se încarcă valoarea 1, cu semnificaţia că în linia 1 se aşează prima regină în coloană.

14 Vom folosi urmatoarele functii si variabile
k = variabila intreaga, reprezinta linia pe care vrem sa punem regina st[k] – variabila intreaga reprezinta coloana pe care se pune regina Functia succ care va returna variabila as = variabila intreaga care primeste val 1, daca pe linia k mai sunt coloane pe care putem sa mai plasam regina, si 0 daca nu mai sunt pozitii in care poate sa fie plasata Functia valid care va returna variabila ev = variabila intreaga care primeste val 1, daca regina de pe linia k nu se ataca cu orice alta regina de pe liniile anterioare, si 0 daca se ataca. Functia Init – care stabileste prima pozitie a reginei Functia Tipar care afiseaza cate o solutie

15 // incep cu prima linie pe care punem o regina
void back() { k=1; init(); while(k>0) do{succ(st,k,as) if (as) valid(st,k,ev) } while(as && !ev); if(as) if(k==n) tipar(); else{k=k+1; init();} else k=k-1; } } // incep cu prima linie pe care punem o regina // intial regina este inafara tablei de sah // cat timp exista linii necompletate pe tabla de sah //se verfica daca mai sunt pozitii libere, daca mai sunt succesori //daca exista succesori, se verifica daca in acea pozitie reginele se ataca // se repeta cautarea cit timp exista pozitii libere si nu sunt valide // daca s-a gasit o pozitie libera si reginele nu se ataca // daca e ultima linie se tipareste solutia // daca nu se trece la linia urmatoare,se intializeaza // daca nu s-a gasit nici o pozitie, ne reintoarcem la linia de dianinte

16 #include <iostream.h>
#include <math.h> int st[100], n, k; void init() { st[k]=0; // intial regina se afla in afara tabei de sah, se porneste dela valoarea minima admisibila din care se scade 1. } void succ( int st[100],int k, int &as) if(st[k]<n) // daca mai sunt pozitii disponibile st[k]= st[k]+1; // trecem la pozitia urmatoare as=1; //semnalam ca am mai gasit o pozitie else as=0; // nu mai exista succesor void valid(int st[100],int k, int &ev) ev=1; // consideram ca pozita e valida , ca nu se ataca cu nimeni for(int i=1; i<k; i++) // pentru toate reginele deja puse pe tabla, de la prima linie la ultima completata if((st[i]==st[k]) || (abs(st[k]-st[i]))==abs(k-i)) ev=0; //daca se ataca pe coloana sau pe diag , pozitia nu e valida

17 sau afisare sub forma de matrice- tabla de sah
void tipar () {for(i=1;i<=n;i++) { for(j=1;j<=n;j++) if (st[i]=j) cout<<”R “; else cout<<”* “;} cout<<endl;} void tipar() { for(int i=1; i<=n;i++) cout<<st[i]; cout<<endl; } void back() { k=1; Init(); while(k>0) do{succ(st,k,as) if (as) valid(st,k,ev) } while(as && !ev); if(as) if(k==n) tipar(); else{k++; Init();} . else k=k-1; } } main() { cout<<”n=”; cin>>n; back(); }

18 Aplicarea metodei presupune:
Ce am retinut? Metoda Backtracking are la baza o strategie prin care se genereaza doar solutiile care îndeplinesc anumite condiţii specifice problemei, denumite conditii interne. Soluţiile posibile care respecta conditiile interne se numesc solutii rezultat. Valorile admise in solutia rezultat se numesc valori valide. Conditiile de validare sunt deduse din conditiile interne. Aplicarea metodei presupune: - codificarea solutiilor – determinarea semnificatiei elementelor st[i]si stabilirea multimilor in care se pot gasi solutiile Ai - determinarea conditiilor interne si a celor de continuare - implementarea algoritmului

19 Mecanismul metodei Se alege din multimea A1 primul element valid X1
Presupunem ca s-a gasit o solutie partiala st=( x1, x2 …,x k-1) si cautam in multimea AK, un nou element disponibil din mulţimea Ak, si verificam daca elementul Xk verifica conditiile de validare(cond. interne) 3. Daca le verifica: 4.se testează dacă s-a ajuns la o soluţie rezultat : 5.daca da, se afiseaza si se trece la obtinerea altei solutii 6.altfel se incrementeaza K ( stiva creste) si se cauta o alta valoare x k+1 7. Daca in multimea Ak nu se mai gasesc valori valide ( s-au testat toate valorile) se decrementeaza k ( stiva scade) si se cauta o alta valoare pentru un x k-1 din multimea A k-1. Algoritmii se termină atunci când nu există nici un element x1 € A1 netestat( stiva este vida).


Download ppt "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."

Similar presentations


Ads by Google