This shows you the differences between two versions of the page.
sd-ca:2017:laboratoare:lab-09 [2018/01/12 18:43] cristian.creteanu [Heap (Bonus)] |
sd-ca:2017:laboratoare:lab-09 [2018/02/19 15:32] (current) cosmin_ioan.petrisor |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Lab 9 - ABC și Heap ====== | + | ====== Lab 9 - ABC si Heap ====== |
- | * Responsabil: [[mailto:cristiancreteanu06@gmail.com | Cristian Crețeanu]] | + | |
- | * Data ultimei modificări: 12.01.2018 | + | |
===== Obiective ===== | ===== Obiective ===== | ||
Line 173: | Line 172: | ||
</code> | </code> | ||
- | =====ABC vs Heap ===== | ||
- | Deși la prima vedere nu există mari diferențe între cele două structuri de date, ele sunt complet diferite. Se poate observa că ele diferă atât la nivelul implementării (bst:pointeri către fii vs heap:vector), cat și al complexităților operațiilor specifice. Totuși, deși ambele se pot folosi în rare cazuri pentru același scop (fără a fi la fel de eficiente), ele au întrebuințări diferite. | ||
- | |||
- | **ABC** | ||
- | * Se folosește pentru a implementa arbori echilibrați, precum AVL, Red-Black | ||
- | * Prezintă toate avantajele unui vector sortat, venind în plus cu inserare în timp constant. | ||
- | * Nu este mereu echilibrat. | ||
- | |||
- | **HEAP** | ||
- | * Heap-ul stă la baza implementării cozii de priorități și a algoritmului heapsort | ||
- | * Se poate folosi pentru găsirea eficientă a celui de-al k-lea cel mai mic/mare (minheap/maxheap) element. | ||
- | * Este mereu un arbore echilibrat (complet) | ||
- | |||
- | <note>Un arbore este **echilibrat** dacă fiecare subarbore este echilibrat și înălțimea orcăror doi subarbori diferă cu cel mult 1. Această regulă stă la baza implementării unui arbore AVL. Arborii roșu-negru impun alte reguli. | ||
- | |||
- | {{ :sd-ca:2017:laboratoare:balancedtree-example.png?300 |}}</note> | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
+ | <hidden> | ||
Acest articol se va realiza pornind de la **{{sd-ca:taskuri:lab9-tasks-2017.zip|scheletul de cod}}**. | Acest articol se va realiza pornind de la **{{sd-ca:taskuri:lab9-tasks-2017.zip|scheletul de cod}}**. | ||
Line 202: | Line 186: | ||
1. [**4p**] Implementați următoarele funcționalități de bază ale unui arbore binar de căutare: | 1. [**4p**] Implementați următoarele funcționalități de bază ale unui arbore binar de căutare: | ||
- | * [**1p**] constructor(**TODO 1.1**), destructor(**TODO 1.2**) | + | * [**1p**] constructor(TODO 1.1), destructor(TODO 1.2) |
- | * [**1p**] adăugare elemente în arbore.(**TODO 1.3**) | + | * [**1p**] adăugare elemente în arbore.(TODO 1.3) |
- | * [**1p**] căutare elemente în arbore. (**TODO 1.4**) | + | * [**1p**] căutare elemente în arbore. (TODO 1.4) |
- | * [**1p**] parcurgere inordine arbore. (**TODO 1.5**) | + | * [**1p**] parcurgere inordine arbore. (TODO 1.5) |
2. [**2p**] Implementați următoarele funcționalități avansate ale unui arbore binar de căutare: | 2. [**2p**] Implementați următoarele funcționalități avansate ale unui arbore binar de căutare: | ||
- | * [**0.5p**] funcții pentru returnare valoare minimă/maximă din arbore. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare. (**TODO 2.1**) | + | * [**0.5p**] funcții pentru returnare valoare minimă/maximă din arbore. Implementaţi eficient, ţinând cont de faptul ca arborele binar este unul de căutare. (TODO 2.1) |
- | * [**0.5p**] calculează şi returnează înălțimea unui arbore. Înălțimea unui arbore se calculează adunând 1 la înălțimea maximă a subarborelui său stâng și a celui drept. (**TODO 2.2**) | + | <code c++> |
- | * [**1p**] funcție pentru afișarea cheilor (informației utile) din nodurile situate pe un anumit nivel primit ca parametru. Nivel = distanța de la rădăcină la un nod, nivelul rădăcinii fiind 0. (**TODO 2.3**) | + | T findMin (); |
+ | T findMax (); | ||
+ | </code> | ||
+ | * [**0.5p**] calculează şi returnează înălțimea unui arbore. Înălțimea unui arbore se calculează adunând 1 la înălțimea maximă a subarborelui său stâng și a celui drept. (TODO 2.2) | ||
+ | <code c++> | ||
+ | int findLevels(); | ||
+ | </code> | ||
+ | * [**1p**] funcție pentru afișarea cheilor (informației utile) din nodurile situate pe un anumit nivel primit ca parametru. Nivel = distanța de la rădăcină la un nod, nivelul rădăcinii fiind 0. (TODO 2.3) | ||
+ | <code c++> | ||
+ | void displayLevel(int level); | ||
+ | </code> | ||
- | 3. [**2p**] Implementați funcția de ștergere a unui element (trebuie să tratați și cazul în care se va șterge elementul din rădăcină). (**TODO 3**) | + | 3. [**2p**] Implementați funcția de ștergere a unui element. (TODO 3) |
+ | <note important> | ||
+ | Trebuie să tratați și cazul în care se va șterge elementul din rădăcină. | ||
+ | </note> | ||
- | ==== Heap (Bonus) ==== | + | ==== Heap-uri ==== |
- | 1. [**1p**] **heap.h** Definiţi o structură de vector pe care să poată fi folosite operaţiile de baza ale unui heap, şi funcţii de construcţie şi eliberare a structurii: | + | 1. [**1p**] **heap.h** Definiţi o structură de vector pe care să poată fi folosite operaţiile de heap-uri, şi funcţii de construcţie şi eliberare a structurii: |
*[**0.5p**] Constructor pentru inițializarea unui heap. ''capVect'' reprezintă numărul maxim de elemente din vector. Codul va trebui să aloce memorie separată şi apoi să lucreze cu acea memorie. | *[**0.5p**] Constructor pentru inițializarea unui heap. ''capVect'' reprezintă numărul maxim de elemente din vector. Codul va trebui să aloce memorie separată şi apoi să lucreze cu acea memorie. | ||
+ | |||
+ | <code c++> | ||
+ | template <typename T> | ||
+ | Heap<T>::Heap(int capVect) | ||
+ | { | ||
+ | // TODO 1.1 | ||
+ | } | ||
+ | </code> | ||
+ | |||
*[**0.5**p] Funcție pentru eliberarea memoriei alocate pentru values. | *[**0.5**p] Funcție pentru eliberarea memoriei alocate pentru values. | ||
+ | |||
+ | <code c++> | ||
+ | template <typename T> | ||
+ | Heap<T>::~Heap() | ||
+ | { | ||
+ | // TODO 1.2 | ||
+ | } | ||
+ | </code> | ||
2. [**3p**] Implementaţi operaţiile elementare de lucru cu heap-uri, prezentate în secţiunile anterioare: | 2. [**3p**] Implementaţi operaţiile elementare de lucru cu heap-uri, prezentate în secţiunile anterioare: | ||
- | *[**1p**] Implementati functiile de calcul ai parintelui si ai descendentilor(functiilor vor întoarce -1 în cazul în care părintele, respectiv descendenţii nu există). | + | *[**1p**] Implementati functiile de calcul ai parintelui si ai descendentilor. |
+ | |||
+ | <code c++> | ||
+ | template <typename T> | ||
+ | int Heap<T>::parent(int poz) | ||
+ | { | ||
+ | // TODO 2.1 | ||
+ | } | ||
+ | |||
+ | template <typename T> | ||
+ | int Heap<T>::leftSubtree(int poz) | ||
+ | { | ||
+ | // TODO 2.1 | ||
+ | } | ||
+ | |||
+ | template <typename T> | ||
+ | int Heap<T>::rightSubtree(int poz) | ||
+ | { | ||
+ | // TODO 2.1 | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Cele trei funcţii de mai sus vor întoarce -1 în cazul în care părintele, respectiv descendenţii nu există. | ||
* [**2p**] Implementati pushUp si pushDown. | * [**2p**] Implementati pushUp si pushDown. | ||
+ | <code c++> | ||
+ | template <typename T> | ||
+ | void Heap<T>::pushUp(int poz) | ||
+ | { | ||
+ | // TODO 2.2 | ||
+ | | ||
+ | } | ||
- | 3. [**1p**] Implementaţi operaţiile uzuale de lucru cu heap-uri. | + | template <typename T> |
+ | void Heap<T>::pushDown(int poz) | ||
+ | { | ||
+ | // TODO 2.2 | ||
+ | |||
+ | } | ||
+ | </code> | ||
+ | |||
+ | 3. [**1p**] Implementaţi operaţiile uzuale de lucru cu heap-uri: | ||
+ | |||
+ | <code c++> | ||
+ | template <typename T> | ||
+ | void Heap<T>::insert(T x) | ||
+ | { | ||
+ | // TODO 3 | ||
+ | } | ||
+ | |||
+ | template <typename T> | ||
+ | T Heap<T>::peek() | ||
+ | { | ||
+ | // TODO 3 | ||
+ | } | ||
+ | |||
+ | template <typename T> | ||
+ | T Heap<T>::extractMin() | ||
+ | { | ||
+ | // TODO 3 | ||
+ | } | ||
+ | </code> | ||
+ | </hidden> | ||
===== Resurse ===== | ===== Resurse ===== |