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:32]
cristian.creteanu [ABC]
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 =====
  
-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.1515778345.txt.gz · Last modified: 2018/01/12 19:32 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