Differences

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

Link to this comparison view

sd-ca:laboratoare:laborator-12 [2015/05/24 12:39]
cosmin_ioan.petrisor [Noțiuni de bază despre treapuri]
sd-ca:laboratoare:laborator-12 [2015/05/28 15:07] (current)
gabriel.cristache [Exerciții]
Line 19: Line 19:
 O structură de date este o metodă de a reține anumite date astfel încât operațiile cu acestea (căutare, inserare, ștergere) să fie făcute cât mai eficient și să respecte cerințele programatorului. De multe ori, o anumită structură de date se află la baza unui algoritm sau sistem, iar o performanță bună a acesteia (complexitate spațială și temporală cât mai mică) influențează performanța întregului sistem. O structură de date este o metodă de a reține anumite date astfel încât operațiile cu acestea (căutare, inserare, ștergere) să fie făcute cât mai eficient și să respecte cerințele programatorului. De multe ori, o anumită structură de date se află la baza unui algoritm sau sistem, iar o performanță bună a acesteia (complexitate spațială și temporală cât mai mică) influențează performanța întregului sistem.
  
-În laboratoarele precedente am observat că un arbore binar de căutare de înălțime **h** implementează operațiile descrise mai sus într-o complexitate de **O(h)**. Dacă acest arbore binar nu este capabil să gestioneze elementele ce sunt inserate pentru a își menține o structura echilibrată atunci complexitatea pe operațiile de baza va crește.+În laboratoarele precedente am observat că un arbore binar de căutare de înălțime **h** implementează operațiile descrise mai sus într-o complexitate de **O(h)**. Dacă acest arbore binar nu este capabil să gestioneze elementele ce sunt inserate pentru a își menține o structura echilibrată atunci complexitatea pe operațiile de bază va crește.
  
 <note tip> <note tip>
Line 37: Line 37:
 Se poate observa că numele structurii de date provine din acești doi invarianți:​ ''​tr-eap''​. Se poate observa că numele structurii de date provine din acești doi invarianți:​ ''​tr-eap''​.
  
-Cum se menține echilibrul structurii? De fiecare dată când un nod este inserat în arbore prioritatea lui este generată aleator (metodă similară cu cea de la randomized quick sort, în care la fiecare pas pivotul este generat aleator) ​-> arborele ​va fi aranjat într-un mod aleator ​(bineînțeles,​ respectând cei doi invarianți) cum numărul arborilor echilibrați este mai mare decât cel al arborilor rău echilibrați,​ șansa este destul de mică ca prioritățile generate aleator să nu mențină arborele echilibrat. +<note important>​ 
-Demonstratia ​complet teoretică asupra faptului că operațiile de baza au complexitatea O(logN) se poate găsi in [2].+**Cum se menține echilibrul structurii?** 
 + 
 +De fiecare dată când un nod este inserat în arbore prioritatea lui este generată aleator (metodă similară cu cea folosită ​la randomized quick sort, în care la fiecare pas pivotul este generat aleator). Arborele ​va fi aranjat într-un mod aleatorbineînțeles,​ respectând cei doi invarianți. Cum numărul arborilor echilibrați este mai mare decât cel al arborilor rău echilibrați,​ șansa este destul de mică ca prioritățile generate aleator să nu mențină arborele echilibrat. 
 +</​note>​ 
 +Demonstraţia ​complet teoretică asupra faptului că operațiile de bază au complexitatea O(logN) se poate găsi în [2].
  
  
Line 57: Line 61:
 ===== Operații de bază ===== ===== Operații de bază =====
  
-Mai jos este descris pseudocodul pentru operațiile de bază făcute cu treapuri.\\ +Mai jos este descris pseudocodul pentru operațiile de bază făcute cu treapuri. 
-Pentru exemplificarea operațiilor am folosit un nod special, numit ''​nil'',​ care reprezintă un nod fictiv, ce nu reține datefolosit pentru a arăta că nu există un nod efectiv în treap. De exemplu, dacă un nod ''​x''​ are ambii fii egali cu ''​nil''​ înseamnă ca ''​x''​ este frunză în arbore.+ 
 +Pentru exemplificarea operațiilor am folosit un nod special, numit ''​nil'',​ care reprezintă un nod fictiv, ce nu reține date şi folosit pentru a arăta că nu există un nod efectiv în treap. De exemplu, dacă un nod ''​x''​ are ambii fii egali cu ''​nil''​ înseamnă ca ''​x''​ este frunză în arbore.
  
 ==== Căutarea ==== ==== Căutarea ====
Line 81: Line 86:
 ==== Inserarea ==== ==== Inserarea ====
  
-Inserarea unui nod se face generand ​o prioritate aleatoare pentru acesta și procedând asemănător ca pentru un arbore de căutare, adăugând nodul la baza arborelui printr-o procedură recursivă, pornind de la rădăcina acestuia.+Inserarea unui nod se face generând ​o prioritate aleatoare pentru acesta și procedând asemănător ca pentru un arbore de căutare, adăugând nodul la baza arborelui printr-o procedură recursivă, pornind de la rădăcină.
  
-Deși inserarea menține invariantul arborelui de căutare, invariantul de heap poate să nu se mai respecte. De aceea, trebuie definite operații de rotire (stânga sau dreapta), care să fie aplicate unui nod în cazul în care prioritatea sa este mai mare decât ce a părintelui său.+Deși inserarea menține invariantul arborelui de căutare, invariantul de heap poate să nu se mai respecte. De aceea, trebuie definite operații de **rotire** (stânga sau dreapta), care să fie aplicate unui nod în cazul în care prioritatea sa este mai mare decât ce a părintelui său.
  
 Mai jos avem pseudocodul pentru operația de inserare. Mai jos avem pseudocodul pentru operația de inserare.
Line 103: Line 108:
 </​code>​ </​code>​
  
- Spre exemplu, dacă am dori să inserăm nodul cu cheia 9 si prioritatea 51, pașii vor arată în felul urmator:+Spre exemplu, dacă am dori să inserăm nodul cu cheia 9 şi prioritatea 51, pașii vor arată în felul următor:
  
 {{ :​sd-ca:​laboratoare:​inserare.png }} {{ :​sd-ca:​laboratoare:​inserare.png }}
  
 +<​note>​
 Se observă necesitatea rotirilor pentru a aduce nodul nou inserat în vârful arborelui (are prioritatea cea mai mare). Se observă necesitatea rotirilor pentru a aduce nodul nou inserat în vârful arborelui (are prioritatea cea mai mare).
 +</​note>​
  
 Cele două tipuri de rotiri sunt prezentate vizual în imaginea de mai jos: Cele două tipuri de rotiri sunt prezentate vizual în imaginea de mai jos:
Line 131: Line 138:
   else if nod.stanga.prioritate > nod.dreapta.prioritate   else if nod.stanga.prioritate > nod.dreapta.prioritate
     rotireDreapta(nod)     rotireDreapta(nod)
-    sterge(nod, cheie);+    sterge(nod, cheie)
   else   else
     rotireStanga(nod)     rotireStanga(nod)
Line 142: Line 149:
 Pentru exerciții porniți de la {{:​sd-ca:​laboratoare:​labtreap-tasks.zip|scheletul de laborator}}. Pentru exerciții porniți de la {{:​sd-ca:​laboratoare:​labtreap-tasks.zip|scheletul de laborator}}.
  
-1. Implementați funcțiile de bază pentru un treap:+1.**[2p]** ​Implementați funcțiile de bază pentru un treap:
     * [0.5p] Căutare     * [0.5p] Căutare
     * [0.5p] Rotiri stânga și dreapta     * [0.5p] Rotiri stânga și dreapta
     * [0.5p] Inserare     * [0.5p] Inserare
     * [0.5p] Ștergere     * [0.5p] Ștergere
 +
 +2.**[1p]** Realizați o parcurgere a treapului astfel încât să obțineți cheile sortate crescător/​descrescător.
 +
 +3.**[2p]** Realizați o parcurgere a treapului astfel încât să obțineți o structură arborescentă a priorităților,​ pentru a observa invariantul de heap.
 +
 +4.**[2p]** Scrieți o funcție care să răspundă într-o complexitate de ''​O(logN)''​ la următoarea cerință: Care este cea de-a K-a cheie, în ordinea sortării crescătoare,​ care se află în treap?
 +
 <​hidden>​ <​hidden>​
-2. [1p] Realizați o parcurgere a treapului astfel încât să obțineți cheile sortate crescător/​descrescător.+2.**[1p]** Realizați o parcurgere a treapului astfel încât să obțineți cheile sortate crescător/​descrescător.
  
-3. [2p] Realizați o parcurgere a treapului astfel încât să obțineți o structură arborescentă a priorităților,​ pentru a observa invariantul de heap.+3.**[2p]** Realizați o parcurgere a treapului astfel încât să obțineți o structură arborescentă a priorităților,​ pentru a observa invariantul de heap.
  
-4. [4p] Scrieți o funcție care să răspundă într-o complexitate de ''​O(logN)''​ la următoarea cerință: Care este cea de-a K-a cheie, în ordinea sortării crescătoare,​ care se află în treap?.+4.**[4p]** Scrieți o funcție care să răspundă într-o complexitate de ''​O(logN)''​ la următoarea cerință: Care este cea de-a K-a cheie, în ordinea sortării crescătoare,​ care se află în treap?.
 </​hidden>​ </​hidden>​
-===== Referințe ​=====+===== Bibliografie ​===== 
 + 
 +[1] [[http://​www.cs.cmu.edu/​afs/​cs.cmu.edu/​project/​scandal/​public/​papers/​treaps-spaa98.pdf | Fast Set Operations Using Treaps]] 
 + 
 +[2] [[http://​compgeom.cs.uiuc.edu/​~jeffe/​teaching/​algorithms/​notes/​10-treaps.pdf | Randomized Binary Search Trees]] 
 + 
 +[3] [[http://​www.cs.cmu.edu/​afs/​cs.cmu.edu/​academic/​class/​15451-s07/​www/​lecture_notes/​lect0208.pdf | Balanced Search Trees]] 
 + 
 +[4] [[http://​en.wikipedia.org/​wiki/​Red%E2%80%93black_tree | Red-black Tree]] 
 + 
 +[5] [[http://​en.wikipedia.org/​wiki/​AVL_tree | AVL Tree]]
  
-  * [[http://​www.cs.cmu.edu/​afs/​cs.cmu.edu/​project/​scandal/​public/​papers/​treaps-spaa98.pdf | Fast Set Operations Using Treaps]] +[6] [[http://en.wikipedia.org/wiki/B-tree B-Tree]]
-  * [[http://compgeom.cs.uiuc.edu/~jeffe/teaching/​algorithms/​notes/​10-treaps.pdf ​Randomized Binary Search Trees]] +
-  * [[http://​www.cs.cmu.edu/​afs/​cs.cmu.edu/​academic/​class/​15451-s07/​www/​lecture_notes/​lect0208.pdf | Balanced Search Trees]]+
sd-ca/laboratoare/laborator-12.1432460387.txt.gz · Last modified: 2015/05/24 12:39 by cosmin_ioan.petrisor
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