Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sda-aa:laboratoare:02 [2021/03/09 18:05]
cristian.rusu
sda-aa:laboratoare:02 [2021/03/09 18:11] (current)
cristian.rusu [4. Exercitii]
Line 3: Line 3:
  
 ==== 1. Obiectivele laboratorului ==== ==== 1. Obiectivele laboratorului ====
-  * Calculul ​complexităţii ​algoritmilor+  * Calculul ​complexitatii ​algoritmilor
   * Implementarea unor algoritmi de sortare   * Implementarea unor algoritmi de sortare
  
  
-==== 2. Calculul ​complexităţii ​algoritmilor ====+==== 2. Calculul ​complexitatii ​algoritmilor ====
  
 === A. Introducere === === A. Introducere ===
  
-Analiza ​complexității ​unui algoritm are ca scop estimarea volumului de resurse de calcul necesare pentru ​execuția ​algoritmului. Prin resurse se înțelege+Analiza ​complexitatii ​unui algoritm are ca scop estimarea volumului de resurse de calcul necesare pentru ​executia ​algoritmului. Prin resurse se intelege
-   ​* ​Spațiul ​de memorie necesar pentru stocarea datelor pe care le prelucrează ​algoritmul. +   ​* ​Spatiul ​de memorie necesar pentru stocarea datelor pe care le prelucreaza ​algoritmul. 
-   * Timpul necesar pentru ​execuția ​tuturor ​prelucrărilor ​specificate ​în algoritm.+   * Timpul necesar pentru ​executia ​tuturor ​prelucrarilor ​specificate ​in algoritm.
  
-Această analiză ​este utilă ​pentru a stabili ​dacă un algoritm ​utilizează ​un volum acceptabil de resurse pentru rezolvarea unei probleme. In acest fel timpul de executie va fi exprimat prin numarul de operatii elementare executate. Sunt considerate operatii elementare cele aritmetice (adunare, scadere, ​inmulțire, impartire), comparatiile si cele logice (negatie, conjuncte ​și disjunctie).+Aceasta analiza ​este utila pentru a stabili ​daca un algoritm ​utilizeaza ​un volum acceptabil de resurse pentru rezolvarea unei probleme. In acest fel timpul de executie va fi exprimat prin numarul de operatii elementare executate. Sunt considerate operatii elementare cele aritmetice (adunare, scadere, ​inmultire, impartire), comparatiile si cele logice (negatie, conjuncte ​si disjunctie).
  
-Este așadar ​suficient sa se contorizeze doar anumite tipuri de operații ​elementare, numite ​operații ​de bază. Timpul de executie al intregului algoritm se obtine insumand timpii de executie ai prelucrarilor componente.+Este asadar ​suficient sa se contorizeze doar anumite tipuri de operatii ​elementare, numite ​operatii ​de baza. Timpul de executie al intregului algoritm se obtine insumand timpii de executie ai prelucrarilor componente.
  
  
Line 23: Line 23:
  
  
-Consideram problema calculului sumei . Dimensiunea acestei probleme poate fi considerata n. Algoritmul si tabelul cu costurile corespunzatoare ​prelucrărilor ​sunt prezentate ​ın Tabel. Insumand timpii de executie ai prelucrarilor elementare se obtine: $T(n)=n(c_3 + c_4 + c_5) + c_1 + c_2 + c_3$ deci $T(n)=k_1n + k_2$, adica timpul de executie depinde liniar de dimensiunea problemei. Costurile operatiilor elementare influenteaza doar constantele ce intervin in functia $T(n)$.+Consideram problema calculului sumei. Dimensiunea acestei probleme poate fi considerata n. Algoritmul si tabelul cu costurile corespunzatoare ​prelucrarilor ​sunt prezentate ​in Tabel. Insumand timpii de executie ai prelucrarilor elementare se obtine: $T(n)=n(c_3 + c_4 + c_5) + c_1 + c_2 + c_3$ deci $T(n)=k_1n + k_2$, adica timpul de executie depinde liniar de dimensiunea problemei. Costurile operatiilor elementare influenteaza doar constantele ce intervin in functia $T(n)$.
  
 {{:​sda-ab:​laboratoare:​complexitati1.png?​600|}} {{:​sda-ab:​laboratoare:​complexitati1.png?​600|}}
  
-**Exemplul 2 - Înmulțirea ​a 2 matrici**+**Exemplul 2 - inmultirea ​a 2 matrici**
  
 Consideram problema determinarii produsului a doua matrici: A de dimensiune $m \times n$ si B de dimensiune $n \times p$. In acest caz dimensiunea problemei este determinata de trei valori: $(m, n, p)$. Consideram problema determinarii produsului a doua matrici: A de dimensiune $m \times n$ si B de dimensiune $n \times p$. In acest caz dimensiunea problemei este determinata de trei valori: $(m, n, p)$.
  
-In practica nu este necesara o analiza atat de detaliata ci este suficient sa se identifice operatia ​dominantă ​si sa se estimeze numarul de repetari ale acesteia. Prin operatie dominanta se ıntelege ​operatia care contribuie cel mai mult la timpul de executie a algoritmului si de regulă ​este operatia ce apare ın ciclul cel mai interior. ​În exemplul ar putea fi considerata ca operatie dominanta, operatia de ınmultire. In acest caz costul executiei algoritmului ar fi $T(m, n, p)=mnp$.+In practica nu este necesara o analiza atat de detaliata ci este suficient sa se identifice operatia ​dominanta ​si sa se estimeze numarul de repetari ale acesteia. Prin operatie dominanta se intelege ​operatia care contribuie cel mai mult la timpul de executie a algoritmului si de regula ​este operatia ce apare in ciclul cel mai interior. ​in exemplul ar putea fi considerata ca operatie dominanta, operatia de inmultire. In acest caz costul executiei algoritmului ar fi $T(m, n, p)=mnp$.
  
 {{:​sda-ab:​laboratoare:​complexitati2.png?​600|}} {{:​sda-ab:​laboratoare:​complexitati2.png?​600|}}
Line 39: Line 39:
 === B. Caracterizarea unui algoritm === === B. Caracterizarea unui algoritm ===
  
-Numim sortare orice aşezare(sau - mai clar - reaşezare) a unor elemente date în aşa fel încâtdupă aşezaresă existe o ordine ​completă în funcţie ​de un atribut(numit cheie) al elementelor.+Numim sortare orice asezare(sau - mai clar - reasezare) a unor elemente date in asa fel incatdupa asezaresa existe o ordine ​completa in functie ​de un atribut(numit cheie) al elementelor.
  
-Pentru a exista o ordine ​completă, trebuie ​să alegem o relaţie ​pe care vrem sa o impunem. ​Dacă relaţia ​este valabilă între ​oricare ​două elemente pentru care primul element este aşezat ​la stânga ​celui de-al doilea, atunci avem o ordine ​completă.+Pentru a exista o ordine ​completa, trebuie ​sa alegem o relatie ​pe care vrem sa o impunem. ​Daca relatia ​este valabila intre oricare ​doua elemente pentru care primul element este asezat ​la stanga ​celui de-al doilea, atunci avem o ordine ​completa.
  
-Exemplu: ​dacă alegem drept cheie un atribut ​număr întreg şi relaţia ​mai mic sau egal, obţinem ​ordinea ​crescătoare.+Exemplu: ​daca alegem drept cheie un atribut ​numar intreg si relatia ​mai mic sau egal, obtinem ​ordinea ​crescatoare.
  
 Vom descrie un algoritm de sortare prin: Vom descrie un algoritm de sortare prin:
-   * timp mediu - timpul de execuţie ​la care ne aşteptămîn medie, pentru sortare +   * timp mediu - timpul de executie ​la care ne asteptamin medie, pentru sortare 
-   * timp la limită- timpul de execuţie ​pentru cel mai rău caz posibil +   * timp la limita- timpul de executie ​pentru cel mai rau caz posibil 
-   * memorie - memoria ​maximă ​de care are nevoie algoritmul pentru sortare(excludem memoria deja alocată înainte ​de algoritm → vectorul efectiv ce va fi sortat) +   * memorie - memoria ​maxima ​de care are nevoie algoritmul pentru sortare(excludem memoria deja alocata inainte ​de algoritm → vectorul efectiv ce va fi sortat) 
-   * stabilitate - un algoritm stabil ​păstrează ​ordinea ​în care apar două elemente cu aceeaşi ​cheie(atributul ​după care sortăm)+   * stabilitate - un algoritm stabil ​pastreaza ​ordinea ​in care apar doua elemente cu aceeasi ​cheie(atributul ​dupa care sortam)
  
-Folosim ​notaţia ​O(n) pentru a indica: +Folosim ​notatia ​O(n) pentru a indica: 
-   * un număr ​de operaţii ​de ordinul lui n. În acest caz, spunem ​că avem „complexitate de timp de ordinul lui n“ +   * un numar de operatii ​de ordinul lui n. in acest caz, spunem ​ca avem „complexitate de timp de ordinul lui n“ 
-   * o dimensiune de ordinul lui n pentru memoria ​alocatăÎn acest caz, spunem ​că avem „complexitate de spaţiu ​de ordinul lui n“+   * o dimensiune de ordinul lui n pentru memoria ​alocatain acest caz, spunem ​ca avem „complexitate de spatiu ​de ordinul lui n“
  
  
Line 61: Line 61:
 In acest curs ati vazut deja algoritmi de sortare precum In acest curs ati vazut deja algoritmi de sortare precum
    * Bubble sort - interschimbare    * Bubble sort - interschimbare
-   * Selection sort - selecţie+   * Selection sort - selectie
    * Insertion sort - inserare    * Insertion sort - inserare
    * Merge sort - interclasare    * Merge sort - interclasare
-   * Quick sort - partiţionare+   * Quick sort - partitionare
  
 === A. Bubble sort === === A. Bubble sort ===
Line 70: Line 70:
 Caracteristici:​ Caracteristici:​
    * timp mediu: O(N^2)    * timp mediu: O(N^2)
-   * timp la limită: O(N^2)+   * timp la limita: O(N^2)
    * memorie: O(1)    * memorie: O(1)
    * Stabil: DA    * Stabil: DA
  
 **Descriere:​** **Descriere:​**
-Sortarea prin metoda bulelor se consideră ​drept una din cele mai puţin ​efective metode de sortare, dar cu un algoritm mai simplu.+Sortarea prin metoda bulelor se considera ​drept una din cele mai putin efective metode de sortare, dar cu un algoritm mai simplu.
  
-Ideea de bază sortării ​prin metoda bulelor este în a parcurge tabloul, de la stânga ​spre dreapta, fiind comparate elementele ​alăturate ​a[i] si a[i+1]. ​Dacă vor fi găsite ​2 elemente neordonate, valorile lor vor fi interschimbate. +Ideea de baza sortarii ​prin metoda bulelor este in a parcurge tabloul, de la stanga ​spre dreapta, fiind comparate elementele ​alaturate ​a[i] si a[i+1]. ​Daca vor fi gasite ​2 elemente neordonate, valorile lor vor fi interschimbate. 
-Parcurgerea tabloului de la stânga ​spre dreapta se va repeta ​atât timp cât vor fi întâlnite ​elemente neordonate.+Parcurgerea tabloului de la stanga ​spre dreapta se va repeta ​atat timp cat vor fi intalnite ​elemente neordonate.
  
 {{:​sda-aa:​laboratoare:​bubble-sort-example-300px.gif?​300|}} {{:​sda-aa:​laboratoare:​bubble-sort-example-300px.gif?​300|}}
Line 112: Line 112:
 Caracteristici:​ Caracteristici:​
    * timp mediu: O(N^2)    * timp mediu: O(N^2)
-   * timp la limită: O(N^2)+   * timp la limita: O(N^2)
    * memorie: O(1)    * memorie: O(1)
    * Stabil: DA    * Stabil: DA
  
 **Descriere:​** **Descriere:​**
-Acest algoritm ​selectează, la fiecare pas i, cel mai mic element din vectorul nesortat(de la poziţia ​până ​la n).Valoarea ​minimă găsită ​la pasul i este pusă în vector la poziţia ​i,facându-se intereschimbarea cu poziţia actuală ​a minimului. Nu este un algoritm indicat pentru vectorii mari, în majoritatea cazurilor oferind rezultate mai slabe decât ​insertion sort şi bubble sort.+Acest algoritm ​selecteaza, la fiecare pas i, cel mai mic element din vectorul nesortat(de la pozitia ​pana la n). Valoarea ​minima gasita ​la pasul i este pusa in vector la pozitia ​i, facandu-se intereschimbarea cu pozitia actuala ​a minimului. Nu este un algoritm indicat pentru vectorii mari, in majoritatea cazurilor oferind rezultate mai slabe decat insertion sort si bubble sort.
  
 {{:​sda-aa:​laboratoare:​selection-sort.gif?​300|}} {{:​sda-aa:​laboratoare:​selection-sort.gif?​300|}}
Line 153: Line 153:
 Caracteristici:​ Caracteristici:​
    * timp mediu: O(N^2)    * timp mediu: O(N^2)
-   * timp la limită: O(N^2)+   * timp la limita: O(N^2)
    * memorie: O(1)    * memorie: O(1)
    * Stabil: DA    * Stabil: DA
  
 **Descriere:​** **Descriere:​**
-Spre deosebire de alţi algoritmi de sortare, sortarea prin inserţie ​este folosită ​destul de des pentru sortarea tablourilor cu număr ​mic de elemente. De exemplu, poate fi folosit pentru a îmbunătăţi ​rutina de sortare ​rapidă.+Spre deosebire de alti algoritmi de sortare, sortarea prin insertie ​este folosita ​destul de des pentru sortarea tablourilor cu numar mic de elemente. De exemplu, poate fi folosit pentru a imbunatati ​rutina de sortare ​rapida.
  
-   * Sortarea prin inserţie seamană ​oarecum cu sortarea prin selecţie. Tabloul este împărţit ​imaginar ​în două părţi ​- o parte sortată şi o parte nesortată. La început, partea ​sortată conţine ​primul element al tabloului ​şi partea ​nesortată conţine ​restul tabloului. +   * Sortarea prin insertie seamana ​oarecum cu sortarea prin selectie. Tabloul este impartit ​imaginar ​in doua parti - o parte sortata si o parte nesortata. La inceput, partea ​sortata contine ​primul element al tabloului ​si partea ​nesortata contine ​restul tabloului. 
-   * La fiecare pas, algoritmul ia primul element din partea ​nesortată şi il inserează în locul potrivit al părţii ​sortate. +   * La fiecare pas, algoritmul ia primul element din partea ​nesortata si il insereaza in locul potrivit al partii ​sortate. 
-   ​* ​Când partea ​nesortată ​nu mai are nici un element, algoritmul se opreste.+   ​* ​Cand partea ​nesortata ​nu mai are nici un element, algoritmul se opreste.
  
 {{:​sda-aa:​laboratoare:​insertion-sort-example-300px.gif?​300|}} {{:​sda-aa:​laboratoare:​insertion-sort-example-300px.gif?​300|}}
Line 191: Line 191:
 Caracteristici:​ Caracteristici:​
    * timp mediu: O(N log N)    * timp mediu: O(N log N)
-   * timp la limită: O(N log N)+   * timp la limita: O(N log N)
    * memorie: O(N)    * memorie: O(N)
    * Stabil: DA    * Stabil: DA
  
 **Descriere:​** **Descriere:​**
-În cazul sortării ​prin interclasare,​ vectorii care se interclasează ​sunt două secvenţe ​ordonate din acelaşi ​vector. Sortarea prin interclasare ​utilizează ​metoda Divide et Impera: +in cazul sortarii ​prin interclasare,​ vectorii care se interclaseaza ​sunt doua secvente ​ordonate din acelasi ​vector. Sortarea prin interclasare ​utilizeaza ​metoda Divide et Impera: 
-   * se împarte ​vectorul ​în secvenţe ​din ce în ce mai mici, astfel ​încât ​fiecare ​secvenţă să fie ordonată ​la un moment dat şi interclasată ​cu o altă secvenţă ​din vector ​corespunzătoare.+   * se imparte ​vectorul ​in secvente ​din ce in ce mai mici, astfel ​incat fiecare ​secventa sa fie ordonata ​la un moment dat si interclasata ​cu o alta secventa ​din vector ​corespunzatoare.
    ​* ​    ​* ​
-   * practic, interclasarea va începe când se ajunge la o secvenţă formată ​din două elemente. Aceasta, ​odată ordonată, se va interclasa cu o alta  +   * practic, interclasarea va incepe cand se ajunge la o secventa formata ​din doua elemente. Aceasta, ​odata ordonata, se va interclasa cu o alta  
-corespunzătoare(cu 2 elemente). Cele două secvenţe ​vor alcătui ​un subşir ​ordonat din vector mai mare(cu 4 elemente) care, la rândul ​lui, se va interclasa cu un subşir corespunzător(cu 4 elemente) ​ş.a.m.d.+corespunzatoare(cu 2 elemente). Cele doua secvente ​vor alcatui ​un subsir ​ordonat din vector mai mare(cu 4 elemente) care, la randul ​lui, se va interclasa cu un subsir corespunzator(cu 4 elemente) ​s.a.m.d.
  
 {{:​sda-aa:​laboratoare:​merge-sort-example-300px.gif?​300|}} {{:​sda-aa:​laboratoare:​merge-sort-example-300px.gif?​300|}}
Line 210: Line 210:
 Caracteristici:​ Caracteristici:​
    * timp mediu: O(N log N)    * timp mediu: O(N log N)
-   * timp la limită: O(N^2)+   * timp la limita: O(N^2)
    * memorie: O(log N)    * memorie: O(log N)
    * Stabil: NU    * Stabil: NU
  
 **Descriere:​** **Descriere:​**
-Quick Sort este unul dintre cei mai rapizi ​şi mai utilizaţi ​algoritmi de sortare ​până în acest moment,bazându-se pe tehnica „Divide et impera“.Deşi cazul cel mai nefavorabil este O(N^2), ​în practică, QuickSort ​oferă ​rezultate mai bune decât ​restul algoritmilor de sortare din clasa „O(N log N)“.+Quick Sort este unul dintre cei mai rapizi ​si mai utilizati ​algoritmi de sortare ​pana in acest moment,bazandu-se pe tehnica „Divide et impera“. ​Desi cazul cel mai nefavorabil este O(N^2), ​in practica, QuickSort ​ofera rezultate mai bune decat restul algoritmilor de sortare din clasa „O(N log N)“.
  
-Algoritmul se bazează ​pe următorii paşi:+Algoritmul se bazeaza ​pe urmatorii pasi:
    * alegerea unui element pe post de pivot    * alegerea unui element pe post de pivot
-   * parcurgerea vectorului din două părţi(de la stânga ​la pivot, de la dreapta la pivot, ambele ​în acelaşi ​timp) +   * parcurgerea vectorului din doua parti(de la stanga ​la pivot, de la dreapta la pivot, ambele ​in acelasi ​timp) 
-   * interschimbarea elementelor care se află pe „partea ​greşită“ a pivotului(mutăm ​la dreapta pivotului elementele mai mari, la stânga ​pivotului elementel mai mici) +   * interschimbarea elementelor care se afla pe „partea ​gresita“ a pivotului(mutam la dreapta pivotului elementele mai mari, la stanga ​pivotului elementel mai mici) 
-   * divizarea algoritmului: ​după ce mutăm ​elementele pe „partea ​corectă“ a pivotului, avem 2 subşiruri ​de sortat, iar pivotul se află pe poziţia bună.+   * divizarea algoritmului: ​dupa ce mutam elementele pe „partea ​corecta“ a pivotului, avem 2 subsiruri ​de sortat, iar pivotul se afla pe pozitia buna.
  
  
Line 227: Line 227:
 ==== 4. Exercitii ==== ==== 4. Exercitii ====
  
-  - Alegeţi ​un algoritm A (dintre Bubble, Insertion ​şi Selection) ​şi un algoritm B (dintre Merge şi Quick). ​Introduceţi nişte ​variabile globale cu care să contorizaţi numărul ​de comparaţii ​pentru algoritmii A şi B. Comparaţi ​rezultatele pentru un vector de întregi ​de lungime n = 20.+  - Alegeti ​un algoritm A (dintre Bubble, Insertion ​si Selection) ​si un algoritm B (dintre Merge si Quick). ​Introduceti niste variabile globale cu care sa contorizati numarul ​de comparatii ​pentru algoritmii A si B. Comparati ​rezultatele pentru un vector de intregi ​de lungime n = 20
 +  - Implementati un algoritm (dintre Bubble, Insertion si Selection) pentru sortarea unui vector cu n cuvinte de maxim 4 litere fiecare. 
 +  - Implementati un algoritm (dintre Merge si Quick) pentru sortarea unui vector de structuri, unde fiecare structura reprezinta un moment de timp(int ora, min, sec). 
 +  - Se da un vector de n intregi, iar toate valorile din vector sunt intre 0 si 1000. Sortati vectorul in timp O(n).
  
-  - Implementaţi un algoritm ​(dintre Bubble, Insertion şi Selection) pentru sortarea unui vector cu n cuvinte de maxim 4 litere fiecare. +**Nota:** Implementati toti algoritmii in fisiere separate ​(.c si .hsi apoi apelati-le din main.c
- +
-  - Implementaţi un algoritm (dintre Merge şi Quickpentru sortarea unui vector de structuri, unde fiecare structură reprezintă un moment de timp(int ora, min, sec). +
- +
-  ​Se dă un vector de n întregi, iar toate valorile ​din vector sunt între 0 şi 1000. Sortaţi vectorul în timp O(n).+
sda-aa/laboratoare/02.1615305906.txt.gz · Last modified: 2021/03/09 18:05 by cristian.rusu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0