You are on page 1of 4

Folosirea bibliotecii STL n rezolvarea unor probleme de concurs

Dumitrescu Ovidiu, Dumitrescu Mihaela ,CN Mircea cel Btrn -Rm.Vlcea I. Despre STL Standard Template Library (STL) este o bibliotec generic, ce furnizeaz soluii pentru manipularea coleciilor de date, precum i algoritmi eficieni care acioneaz asupra acestor date. STL, este o biblioteca formata din clase container, algoritmi si iteratori. Toate componentele STL sunt abloane de clase sau abloane de functii. Biblioteca STL este parte integranta a C++ Standard Library. Aceasta din urma, la randul ei, extinde limbajul C++. STL (Standard Template Library) privit foarte simplu, din punctul de vedere al concurentului, este o colecie de structuri de date i algoritmi aplicai asupra acestora. La concursurile de nivelul Olimpiadei Nationale de Informatic, STL-ul se poate folosi si este de un real folos pentru elevii care au aprofundat limbajul C++ i stpnesc aceste biblioteci. Sftuim concurenii s studieze cu atenie i algoritmii clasici de sortare rapid, de generare de permutri, de cutare binar,etc i s nu se bazeze n concursuri doar pe aceste cunostine avansate de STL. De multe ori la concursuri se dau probleme asemnatoare algoritmilor clasici in care folosirea acestor biblioteci nu mai poate fi facut iar cunotinele acumulate n eleborarea algoritmilor clasici le vor fi de un real folos. Folosirea STL n concursuri trebuie s reprezinte doar un instrument ajuttor menit s salveze timp i memorie. Pentru scopurile n care vom folosi noi STL-ul nu este nevoie de cunotine avansate de programare orientat obiect. STL-ul se bazeaz pe cteva template-uri (abloane) care fac aplicabili toi algoritmii pentru orice tip de structuri de date. Pentru a v arta importana STL-ului trebuie precizat de la nceput faptul c aceast librrie este standard. Toate exemplele au fost testate cu MinGW. Datorit faptului c librria este relativ nou, ea nu este disponibil n Borland C++ 3.1.

40
II. Aplicaii C++ n care folosim biblioteca STL Un prim exemplu de aplicaie n care puterea STL-ului este evident poate fi considerat problema generrii de permutri. Exist diverse metode de rezolvare a problemei de mai jos, ns fiecare dintre ele necesit un timp de ordinul O(n!). Putem genera permutrile prin metoda ordinii lexicografice cresctoare, prin definiia recursiv a permutrilor sau folosind reprezentarea acestora prin vectorii de inversiune. Algoritmul next_permutation din STL are complexitate O(last-first)/2 interschimbri i are urmtoarele prototipuri: 1

template <class BidIt> bool next_permutation(BidIt first, BidIt last); template <class BidIt, class BinPred> bool next_permutation(BidIt first, BidIt last, BinPred pr); Efectul const n transformarea secvenei definit de intervalul [first, last] n permutarea urmtoare n ordine lexicografic. Pentru compararea elementelor, prima funcie utilizeaz operator<, iar cealalt predicatul binar pr. Algoritmul next_permutation returneaz true, dac o permutare urmtoare exist. Dac nu exist, atunci transform secvena n cea mai mic permutare, in ordine lexicografic, i returneaz false. Generare de permutari
Sa se genereze toate permutarile multimii {1, 2, ...N}, in ordine lexicografica.

Date de intrare:
In fisierul de intrare permutari.in se gaseste pe prima linie numarul natural N.

Date de iesire:
In fisierul de iesire permutari.out se vor afisa permutarile multimii, fiecare pe cate o linie.

Restrictii:
1 N 8

Exemplu: permutari.in 3 1 1 2 2 3 3 2 3 1 3 1 2 3 2 3 1 2 1 permutari.out

Sursa in C++ cu folosirea bibliotecii STL este urmatoarea: #include <stdio.h> #include <algorithm> using namespace std; int main() { int i,v[100],n; freopen("permutari.in","r",stdin); freopen("permutari.out","w",stdout); 2

scanf("%d",&n); for (i=1;i<=n;i++) {v[i]=i;printf("%d ",v[i]);}printf("\n"); while (next_permutation(v+1, v+1+n)) /*next_permutation va returna false dupa afisarea celor n! permutari*/ {for (i=1;i<=n;i++) printf("%d ",v[i]);printf("\n"); } return 0;} Un alt exemplu de folosire a STL-ului n rezolvarea unor probleme este dat n exemplul de mai jos n care se folosete un algoritm de cutare binar precedat de un algoritm de sortare. STL-ul propune algoritmi de sortare puternic optimizai n ordonarea elementelor ntr-un interval. Nu ntotdeauna avem nevoie de o sortare complet. De exemplu dac dorim s identificm doar primele zece elemente ordonate cresctor, dintre cele n din container, utilizm unul dintre algoritmii de sortare parial din STL. n asemenea situaii, este preferabil utilizarea acestora, ntruct ofer o performan mai bun. Algoritmul sort, are urmtoarele prototipuri: template <class RanIt> void sort(RanIt first, RanIt last) Sorteaz elementele din intervalul [first,last) i are o complexitate de O(N*log N) comparaii, unde N==last-first. Algoritmul upper_bound face parte din clasa algoritmilor de cutare binar i are urmtoarele prototipuri: template <class FwdIt, class T> FwdIt upper_bound(FwdIt first, FwdIt last, const T& val); template <class FwdIt, class T, class BinPred> FwdIt upper_bound(FwdIt first, first, FwdIt last, const T& val, BinPred pr); Acest prototip gsete cea mai ndeprtat poziie n care val poate fi inserat, astfel nct s nu strice relaia de ordine. Returneaz cel mai ndeprtat iterator i din intervalul [first, last], astfel nct, pentru fiecare iterator j din intervalul [first, i), au loc urmtoarele condiii corespunztore: !(val < *j) sau pr(val, *j) == false. Complexitatea este O(log(last-first)+1 . n aplicaia de mai sus am prezentat doar trei algoritmi STL : next_permutation, sort i upper_bound. Am dorit s artm ct de eficiente sunt aceste tehnici STL n rezolvarea acestor probleme. Sperm ca prin aceast expunere s v facem curioi s studiai ntreaga bibliotec STL pentru rezolvarea anumitor probleme de concurs. O bibliotec ne devine util din momentul n care tim s folosim instrumentele pe care le pune la dispoziie. Pentru programatori (iar pe olimpicii notri i putem numi deja programatori), rspunsul la ntrebarea cum este construit ? un anumit instrument de lucru este mai puin important dect deprinderea de a folosi n mod efectiv acest instrument n rezolvarea sarcinilor concrete. 3

You might also like