Differences

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

Link to this comparison view

sd-ca:2017:laboratoare:lab-09 [2018/01/12 19:41]
cristian.creteanu [Notiuni teoretice - Heap]
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 78: Line 77:
  
 <note tip> <note tip>
-Se consideră că arborele este aşezat în vector în ordine (începând de la 0) de la primul nivel până la ultimul, iar nodurile fiecărui nivel se aşează de la stânga la dreapta.+Se consideră că arborele este aşezat în vector în ordine (începând de la 0) de la primul nivel până la ultimul, iar nodurile fiecărui nivel se aşează de la stânga la dreapta. Poziţiile fiecărui nod în nivel se consideră ca şi când arborele ar fi complet (iar nodurile lipsă sunt ignorate).
 </​note>​ </​note>​
  
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 =====
  
-Acest articol se va realiza pornind de la **{{:sd-ca:2017:​laboratoare:​lab9-tasks-2017.rar| scheletul de cod}}**.+<​hidden>​ 
 +Acest articol se va realiza pornind de la **{{sd-ca:taskuri:​lab9-tasks-2017.zip|scheletul de cod}}**. 
 ==== ABC ==== ==== ABC ====
  
Line 200: Line 185:
   * Funcția ''​removeKey''​ întoarce adresa noului nod rădăcină,​ dacă s-a șters vechea rădăcină.   * Funcția ''​removeKey''​ întoarce adresa noului nod rădăcină,​ dacă s-a șters vechea rădăcină.
  
-1. [**4p**] ​(BinarySearchTree.h) ​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**] ​(BinarySearchTree.h) ​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) 
-    * [**1.5p**] 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.2**)+<code c++> 
 +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. [**3p**] (BinarySearchTree.h) ​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>​
  
-4. [**2p**] (BinaryTree.h) Implementați o funcție care verifică dacă un arbore este un ABC. 
-==== Heap (Bonus) ==== 
  
-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:+==== Heap-uri ==== 
 + 
 +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.
 +     
 +
 +</​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 =====
sd-ca/2017/laboratoare/lab-09.1515778917.txt.gz · Last modified: 2018/01/12 19:41 by cristian.creteanu
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