Sunteți pe pagina 1din 3

Algoritmi de tip succesor

Se pot utiliza n cazul problemelor n care soluia este reprezentat sub forma unui ir (vector, cu componente alese din mulimi finite, nevide i ordonate cresctor) i este necesar determinarea irului urmtor sau precedent n ordine lexicografic1 Poate fi generalizat pentru generarea tuturor irurilor de acest tip, ordonate lexicografic
Algoritmi fundamentali: generare submulimi, produs cartezian, combinri, aranjamente, permutri

Algoritm general pentru determinarea soluiei urmtoare n ordine lexicografic:


Pas 1. Se iniializeaz irul cu configuraia dat x=( x1, x2,...xn) Pas 2. Se determin, dac exist, cel mai mare indice k, 1kn, cu proprietatea c elementul x[k] are succesor n mulimea din care ia valori Pas 2.1. dac nu exist k, soluia dat este cea mai mare n ordine lexicografic Pas 2.2. dac exist k, x[k] se actualizeaz cu elementul urmtor lexicografic din mulimea corespunztoare i se completeaz soluia cu x[k+1], x[k+2] x[n] alese astfel nct s reprezinte secvena minim corect conform ordinii lexicografice.

Generare submulimi
Fie n un numr natural nenul. S se genereze toate submulimile mulimii {0, 1, , n-1}. Soluie Vom reprezenta submulimile prin vector caracteristic (un vector x cu n componente 0 sau 1, avnd semnificaia x[i]=1, dac i aparine submulimii i 0 n caz contrar). Problema se reduce astfel la generarea tuturor secvenelor binare de lungime n. Pentru a rezolva aceast problem vom utiliza un algoritm de tip succesor astfel: Pas 1. Se iniializeaz soluia cu mulimea vid (configuraie minim n ordine lexicografic un ir de n valori 0) Pas 2. Ct timp este exist succesor se afieaz configuraia curent se genereaz configuraia urmtoare lexicografic: determinm cel mai mare k astfel nct x[k] admite succesor (identificm prima valoare 0 de la dreapta la stnga); x[k]=1 i toate valorile x[k+1], x[k+2] x[n] devin 0 (secvena minim n ordine lexicografic) cnd k<1 (toate valorile sunt egale cu 1 n soluie), nu mai exist successor i algoritmul se oprete

Generare elemente produs cartezian


Fie n un numr natural (n>1) i M=(m1, m2, ..., mn) n numere naturale nenule. S se determine n ordine lexicografic toate elementele produsului cartezian {1, 2, ..., m1}x{1, 2, ..., m2}x...x{1, 2, ..., mn}.

Fie x=(x1, x2, ..., xn) i y=(y1, y2, ..., ym). Spunem c x este mai mic lexicografic dect y dac exist k astfel nct xk<yk i xi=yi, orice i<k sau xi=yi orice inm.

De exemplu, pentru n=3 i L=(2, 3, 2), elementele produsului cartezian sunt: (1,1,1), (1,1,2), (1,2,1), (1,2,2), (1,3,1), (1,3,2), (2,1,1), (2,1,2), (2,2,1), (2,2,2), (2,3,1), (2,3,2). Produsul cartezian are m1*m2*...*mn elemente. Soluie Reprezentm soluia ca un vector x cu n elemente, unde x[i]{1, 2, ..., mi}. Generm elementele produsului cartezian n ordine lexicografic cu un algoritm de tip succesor astfel: Pas 1. Se iniializeaz vectorul x cu 1 (cel mai mic element al produsului cartezian, din punct de vedere lexicografic). Pas 2. Ct timp exist succesor se afieaz elementul curent; se genereaz configuraia urmtoare lexicografic: determinm cel mai mare k astfel nct x[k] poate fi mrit (adic x[k]<m[k]); dac gsim o astfel de component o mrim cu 1 i resetm cu 1 toate componentele urmtoare; dac nu gsim o astfel de component deducem c generarea s-a ncheiat, acesta a fost cel mai mare irs din punct de vedere lexicografic.

Generare combinri
Fie n i m dou numere naturale, 1mn20. S se genereze n ordine lexicografic toate submulimile formate din m elemente ale mulimii {1, 2, ..., n} (ordinea elementelor n submulime nu este semnificativ). Soluie Reprezentm soluia ca un vector x cu m elemente distincte, alese din mulimea {1, 2, ..., n}, 1x[i]n, 1im. Deoarece ordinea elementelor n submulime nu conteaz, pentru a nu obine de mai multe ori aceeai soluie, impunem ca elementele submulimii s fie generate n ordine cresctoare: x[i]<x[i+1], pentru orice 1i<m. Cea mai mic submulime conform ordinii lexicografice este {1, 2, ..., m} iar cea mai mare submulime este {n-m+1,..., n-1, n} Observm c atunci cnd poziia scade cu 1, valoarea maxim scade cu 1, deci diferena dintre orice indice k i maxim ce poate fi ales pe poziia k este constant:
maxim-k = n-m

Deducem c valoarea maxim care poate fi plasat pe poziia k este n-m+k. Generm submuimile printr-un algoritm de tip successor astfel: Pas 1. Se iniializeaz vectorul x cu cea mai mic submulime n ordine lexicografic (x[i]=i, pentru orice 1im) Pas 2. Ct timp exist succesor se afieaz submulimea curent; se genereaz submulimea urmtoare: cutm prima component (ncepnd din dreapta ctre stnga) care poate fi mrit (adic x[i]<n-m+i); dac gsim o astfel de component o mrim, i repunem pe cea mai mic valoare posibil toate componentele urmtoare (x[j]=x[j-1]+1, i<jm); dac nu gsim o astfel de component deducem c generarea s-a ncheiat, acesta a fost cea mai mare submulime din punct de vedere lexicografic.

Aplicaii
1. Cod de identificare Pentru a concura cu numrul de serie de la procesoarele Intel Pentium III, Advanced Micro Devices a stabilit un sistem de identificare pentru noile procesoare cu numele de cod Thunderbird. Fiecare firm distribuitoare primete o mulime de litere (de exemplu {a, m, x}) din care va trebui s-i formeze codurile proprii de identificare. Firmelor li se impune exact de cte ori trebuie s apar fiecare liter n aceste coduri. De exemplu, o firm trebuie s formeze identificatori care s conin exact 3 litere a, 2 litere m i 1 liter x. Scriei un program care, cunoscnd un anumit cod dat, determin urmtorul cod corect n ordine lexicografic, dac exist un astfel de cod urmtor. (ONI Constana 2000, IX) Date de intrare Fiierul de intrare COD.IN conine un cod. Codurile sunt formate din cel mult 100 de litere mici ale alfabetului latin. Date de ieire Fiierul de ieire COD.OUT va conine o singur linie pe care se va afla codul urmtor; dac nu exist un astfel de cod, atunci n fiier se va scrie Este ultimul cod. Exemple
COD.IN amaaxm COD.IN xmmaaa COD.OUT amamax COD.OUT Este ultimul cod.

2. Paranteze
Fie n un numr natural (1<n<10000) i p1p2p3...pn o succesiune de paranteze rotunde care se nchid corect. Determinai parantezarea imediat urmtoare din punct de vedere lexicografic, dac exist. Dac nu exist, se va scrie eroare.

Exemplu parant.in
8 (()())()

parant.out
(())(())

3. Campion.edu.ro/arhiva adunscad pluricex grupuri Bibliografie Cerchez, Emanuela, erban, Marinel, Programarea n Limbajul C/C++ pentru liceu, Ed. Polirom, Iai, 2005 http://www.campion.edu.ro/arhiva

S-ar putea să vă placă și