Complexitatea+algoritmilor


 * Resurse Internet || http://web.mit.edu/16.070/www/lecture/big_o.pdf ||
 * || http://bigocheatsheet.com/ ||
 * || http://web.info.uvt.ro/~dzaharie/alg/alg2011_folii4.ppt ||

-timp de executie -spatiu de memorie
 * 1. Complexitatea algoritmilor **

-operatii elementare

Caz- favorabil/defavorabil/mediu

O(log n) - algoritmi logaritmici O(n) - algoritmi liniari O(nlog n) -algoritmi polilogaritmici O(n2 ) - algoritmi patratici O(nk) - algoritmi polinomiali O(2n) - algoritmi exponentiali
 * 2. Clase de algoritmi: **


 * 3. Masurarea timpului de executie al unui program – folosind functia clock **

**Exemplu de program care masoara timpul de executie:**

using namespace std; int main { clock_t t_start, t_fin ; t_start = clock; //momentul inceperii// ..... instructiunile carora doresc sa le masor timpul de executie t_fin = clock ; //momentul final// //cout<<(double)( t_fin - t_start)/CLOCKS_PER_SEC ;// durata de executie return 0 ; }
 * 1) include

Probleme propuse (din variantele de bac)

1. Fişierul ** BAC.TXT ** are pe prima linie două numere naturale ** n ** şi ** m ** ( ** 0<n<1000 **, ** 0<m<1000 ** ) separate prin câte un spaţiu, pe linia a doua ** n ** numere întregi ordonate strict crescător, iar pe linia a treia ** m ** numere naturale distincte. Numerele din fişier aflate pe linia a doua şi a treia au cel mult ** 6 ** cifre fiecare şi sunt despărţite în cadrul liniei prin câte un spaţiu. Să se scrie un program care citeşte toate numerele din fişier şi afişează pe ecran, despărţite prin câte un spaţiu, toate numerele de pe a doua linie a fişierului care apar şi pe linia a treia a acestuia. atunci se va afişa: ** 5 2 8 4 **, nu neapărat în această ordine.
 * Exemplu: ** dacă fişierul are următorul conţinut:
 * 6 5 **
 * 2 3 4 5 8 9 **
 * 4 5 2 11 8 **
 * a) ** Descrieţi în limbaj natural o metodă de rezolvare eficientă ca timp de executare. **(4p.)**
 * b) ** Scrieţi programul ** C/C++ ** corespunzător metodei descrise la punctul **a)**. **(6p.)**

următoarea linie ** n ** numere naturale din intervalul ** [1,100] ** separate prin câte un spaţiu. Se cere să se citescă din fişier toate numerele şi să se afişeze pe ecran numărul sau numerele care apar de cele mai multe ori printre numerele citite de pe a doua linie a fişierului. Numerele afişate vor fi separate prin câte un spaţiu. Alegeţi un algoritm de rezolvare eficient atât din punctul de vedere al timpului de executare cât şi al gestionării memoriei. . pe ecran se vor afişa valorile ** 2 **, ** 3 ** şi ** 9 ** , nu neapărat în această ordine. descrise la punctul a). **(6p.)**
 * 2. ** Fişierul text **bac.in** conţine pe prima sa linie un număr natural ** n ** ( ** 0<n<10000 ** ), iar pe
 * Exemplu: ** dacă fişierul **bac.in** are următorul conţinut:
 * 12 **
 * 1 2 2 3 2 9 3 3 9 9 7 1 **
 * a) ** Explicaţi în limbaj natural metoda utilizată justificând eficienţa acesteia (4-6 rânduri) **(4p.)**
 * b) ** Scrieţi programul ** C/C++ ** ce rezolvă problema enunţată, corespunzător metodei

3. Se citeşte de pe prima linie a fişierului ** numere.in ** un număr natural ** n ** ( ** 0<n<10000 ** ) şi, de pe a doua linie a fişierului, ** n ** numere naturale din intervalul ** [1,100] ** şi se cere să se afişeze pe ecran, în ordine crescătoare, despărţite prin câte un spaţiu, numărul sau numerele întregi din intervalul ** [1,100] ** care **nu** apar printre numerele citite. Dacă pe a doua linie a fişierului apar toate numerele din intervalul precizat, se va afişa mesajul ** NU ** vedere al timpului de executare. se vor afişa valorile ** 12 13 **** … **** 99 **. descrise la punctul **a)**. **(6p.)**
 * LIPSESTE NICIUN NUMAR ** . Alegeţi un algoritm de rezolvare eficient din punctul de
 * Exemplu: ** pentru fişierul ** numere.in ** cu următorul conţinut
 * 12 **
 * 4 2 3 1 6 5 7 8 9 11 10 100 **
 * a) ** Explicaţi în limbaj natural metoda utilizată, justificând eficienţa acesteia (4-6 rânduri).
 * (4p.) **
 * b) ** Scrieţi programul ** C/C++ ** ce rezolvă problema enunţată, corespunzător metodei

4. Fişierul text **bac.in** conţine pe prima sa linie un număr natural ** n ** ( ** 0<n<10000 ** ), iar pe următoarea linie ** n ** numere naturale din intervalul ** [1,100] **. Se cere să se citescă din fişier toate numerele şi să se afişeze pe ecran, în ordine descrescătoare, toate numerele care apar pe a doua linie a fişierului şi numărul de apariţii ale fiecăruia. Dacă un număr apare de mai multe ori, el va fi afişat o singură dată. Fiecare pereche „valoare - număr de apariţii” va fi afişată pe câte o linie a ecranului, numerele fiind separate printr-un spaţiu, ca în exemplu. Alegeţi un algoritm de rezolvare eficient din punctul de vedere al timpului de executare. pe ecran se vor afişa, în această ordine, perechile: descrise la punctul a). **(6p.)**
 * Exemplu: ** dacă fişierul bac.in are următorul conţinut:
 * 12 **
 * 1 2 2 3 2 2 3 3 2 3 2 1 **
 * 3 4 **
 * 2 6 **
 * 1 2 **
 * a) ** Explicaţi în limbaj natural metoda utilizată justificând eficienţa acesteia (4-6 rânduri) **(4p.)**
 * b) ** Scrieţi programul ** C/C++ ** ce rezolvă problema enunţată, corespunzător metodei

5. Fişierul text ** NUMERE.IN ** conţine, pe mai multe linii, cel mult ** 30000 ** de numere naturale nenule mai mici sau egale cu ** 500 **, numerele de pe fiecare linie fiind despărţite prin câte un spaţiu. Fişierul conţine cel puţin două numere distincte, fiecare având două cifre. fişierul text ** NUMERE.OUT ** care să conţină pe prima linie cel mai mare număr de două cifre din fişierul ** NUMERE.IN **, şi de câte ori apare el în acest fişier, iar pe a doua linie, cel mai mic număr de două cifre din fişierul ** NUMERE.IN ** şi de câte ori apare el în acest fişier. Alegeţi o metodă de rezolvare eficientă din punct de vedere al memoriei utilizate şi al timpului de  executare. **(6p.)** ce constă eficienţa ei (3 – 4 rânduri). **(4p.)** alăturat: atunci fişierul ** NUMERE.OUT ** va avea următorul conţinut:
 * a) ** Scrieţi programul ** C/C++ ** care citeşte toate numerele din fişierul ** NUMERE.IN ** şi creează
 * b) ** Descrieţi succint, în limbaj natural, metoda de rezolvare folosită la punctul **a)**, explicând în
 * Exemplu: ** dacă fişierul
 * NUMERE.IN ** are conţinutul
 * 2 253 34 3 **
 * 6 88 9 2 3 **
 * 4 54 34 88 **
 * 88 2 **
 * 34 **

numere naturale nenule mai mici sau egale decât ** 30000 **, despărţite prin câte un spaţiu; fiecare linie se termină cu numarul ** 0 ** (care se consideră că nu face parte din şirul aflat pe linia respectivă) şi conţine cel puţin două valori. cele mai puţine numere. În cazul în care există mai multe şiruri cu acelaşi număr minim de numere, se va afişa cea mai mare valoare care apare în unul dintre aceste şiruri. Alegeţi o metodă de rezolvare eficientă din punct de vedere al memoriei utilizate şi al timpului de  executare. **(6p.**) ce constă eficienţa ei (3 – 4 rânduri). **(4p.)** alăturat, atunci pe ecran se va afişa numărul ** 253 **.
 * 6. ** Fişierul text ** NUMERE.IN ** conţine mai multe linii, pe fiecare linie existând câte un şir de
 * a) ** Scrieţi programul ** C/C++ ** care afişează pe ecran valoarea maximă din şirul care conţine
 * b) ** Descrieţi succint, în limbaj natural, metoda de rezolvare folosită la punctul **a)**, explicând în
 * Exemplu: ** dacă fişierul ** NUMERE.IN ** are conţinutul
 * 2 253 34 3 0 **
 * 6 88 9 3 0 **
 * 4 54 88 12345 98 234 546 0 **

7. Fişierul text ** bac.txt ** conţine un şir de cel mult ** 2009 ** numere naturale, cu cel mult **nou** **ă ** cifre fiecare, pe mai multe rânduri, numerele de pe acelaşi rând fiind separate prin câte un spaţiu. suma cifrelor pare este egală cu suma cifrelor impare, precum şi numărul de apariţii în fişier ale acestui număr, folosind o metodă eficientă din punctul de vedere al timpului de executare. Cele două valori vor fi afişate pe o linie a ecranului, separate printr-un spaţiu. Dacă nu există asemenea valori se afişează mesajul ** NU EXISTA **.
 * a) ** Scrieţi un program ** C/C++ ** care afişează pe ecran cel mai mic număr din fişier pentru care
 * Exemplu ** : dacă în fişier avem numerele ** 22031 9021 22031 1021 2011 10012 1021 **
 * 457008 99882 ** atunci pe ecran se vor afişa numerele: ** 1021 2 ** . **(6p.)**
 * b) ** Descrieţi succint, în limbaj natural, algoritmul utilizat, justificând eficienţa acestuia. **(4p.)**