Sunteți pe pagina 1din 42

Universitatea

Politehnica
Bucureti

Do you see the young lady?


or the old lady?

Structuri de Date Treap


alexandru.olteanu@cs.pub.ro

STRUCTURI DE DATE CURSUL 11 - Treap

Exercitii Heap

Care dintre acestea este un Max-Heap?

Mai 2015

STRUCTURI DE DATE CURSUL 11 - Treap

Exercitii Heap

Creati un Heap pe baza acestor chei:


10, 12, 1, 14, 8, 6, 5

Mai 2015

STRUCTURI DE DATE CURSUL 11 - Treap

Exercitii Heap

Eliminati cheia 14 din Heap-ul obtinut in exercitiul precedent

Mai 2015

STRUCTURI DE DATE CURSUL 11 - Treap

Exercitii Heap

Scrieti o functie care verifica un Heap daca este organizat corect

Mai 2015

STRUCTURI DE DATE CURSUL 11 - Treap

Exercitii Heap

Care dintre urmatoarele este un Max-Heap valid?


a) 25,12,16,13,10,8,14
b) 25,12,16,13,10,8,14
c) 25,14,16,13,10,8,12
d) 25,14,12,13,10,8,16
e) Toate cele de mai sus

Mai 2015

STRUCTURI DE DATE CURSUL 11 - Treap

Exercitii Heap

Cum va arata vectorul de la exercitiul precedent dupa doua operatii pop?

Mai 2015

STRUCTURI DE DATE CURSUL 11 - Treap

Exercitii Heap

Se da un heap binar reprezentat cu un array, folosit incepand cu pozitia 1.


Pentru un element de indice i, indicele parintelui sau va fi:
a)
b)
c)
d)

i-1
floor(i/2)
ceil(i/2)
(i+1)/2

Daca array-yl ar fi folosit incepand cu pozitia 0, care ar fi raspunsul?

Mai 2015

STRUCTURI DE DATE CURSUL 11 - Treap

Recapitulare BST
Chei stocate n noduri
Cheia unui nod este:
mai mare dect cheile nodurilor din subarborele stng
mai i dect cheile nodurilor din subarborele drept

Operaii
inserare, tergere, gsire maxim, gsire minim
O(adncime_arbore)

Mai 2015

STRUCTURI DE DATE CURSUL 11 - Treap

Aplicatii

Scheduler-ul de Linux kernel folosete arbore rou-negru


Jocuri video obiecte din plan care trebuie inserate, terse i
gsite

Mai 2015

10

STRUCTURI DE DATE CURSUL 11 - Treap

Probleme BST
Comportament bun pe chei random, dar prost pe input
particular
Exemplu: chei sortate

Mai 2015

11

STRUCTURI DE DATE CURSUL 11 - Treap

Probleme BST

Standard Template Library nu ajut ntotdeauna


Dei exist set, multiset, priority_queue, nu pot o i e a k-a
cheie dintr-o uli e de chei

Mai 2015

12

STRUCTURI DE DATE CURSUL 11 - Treap

Cum rezolv ?
Facem rotaii n arbore ( ei proprietatea de arbore de
utare)

Mai 2015

13

STRUCTURI DE DATE CURSUL 11 - Treap

Cum rezolv ?
Rotaie dreapta:
Z->left = B; W->right = Z

Rotaie stnga:
W->right = B; Z->left = W;

n pra ti :
valori auxiliare pentru interschimbare
grij la pri te
noduri nil pentru nodurile care nu au 2 fii

Mai 2015

14

STRUCTURI DE DATE CURSUL 11 - Treap

Echilibrare
Totui, cnd facem rotaiile?
i vom asigna fie rui nod, la inserare, o prioritate
random
Prioritatea unui nod trebuie s fie mai mare ca
prioritatea fiilor si (invariantul de heap)
Vom folosi rotaii ca s asigur pstrarea acestui
invariant

Mai 2015

15

STRUCTURI DE DATE CURSUL 11 - Treap

Echilibrare

Mai 2015

16

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
Un treap este un arbore binar care respe t doi
i varia i
Invariantul arborelui de utare pentru chei (tree)
Invariantul de heap pentru prioriti (heap)

=> treap

Mai 2015

17

STRUCTURI DE DATE CURSUL 11 - Treap

Treap

Operatii Treap:
cautare
inserare
stergere

Mai 2015

18

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
public:
TreapNode<T> *left_son, *right_son, *parent;
int prio;
...
}

Mai 2015

19

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
public:
T info;
TreapNode<T> *left_son, *right_son, *parent;
int prio;
TreapNode(int (*compare)(T, T), T info) {
left_son = right_son = parent = NULL;
// Choose a random priority.
prio = rand();
}
...
}

Mai 2015

20

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
TreapNode<T>* find_info(T x) {
if (compare(x, info) == 0)
return this;
if (compare(x, info) <= 0) {
if (left_son != NULL)
return left_son->find_info(x);
else
return NULL;
} else {
if (right_son != NULL)
return right_son->find_info(x);
else
return NULL;
}
}
...
}

Mai 2015

21

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
TreapNode<T>* insert_info(T x) {
int next_son;
TreapNode<T>* result;
if (compare(x, info) <= 0)
next_son = 0;
else
next_son = 1;
... // vezi pagina urmatoare
}
...
}

Mai 2015

22

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
TreapNode<T>* insert_info(T x) {
...
if (next_son == 0) { // left son
if (left_son == NULL) {
left_son = new TreapNode<T>(compare, x);
left_son->parent = this;
left_son->push_up();
result = left_son;
} else
result = left_son->insert_info(x);
} else { // right son
if (right_son == NULL) {
right_son = new TreapNode<T>(compare, x);
right_son->parent = this;
right_son->push_up();
result = right_son;
} else
result = right_son->insert_info(x);
}
return result;
}
...
}

Mai 2015

23

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
void rotate_right() {
TreapNode<T>* gparent = parent->parent;
TreapNode<T>* rson = right_son;
parent->left_son = rson;
if (rson != NULL)
rson->parent = parent;
right_son = parent;
parent->parent = this;
if (gparent != NULL) {
if (gparent->left_son == parent)
gparent->left_son = this;
else
gparent->right_son = this;
}
parent = gparent;
}
...
}

Mai 2015

24

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
void rotate_left() {
TreapNode<T>* gparent = parent->parent;
TreapNode<T> *lson = left_son;
parent->right_son = lson;
if (lson != NULL)
lson->parent = parent;
left_son = parent;
parent->parent = this;
if (gparent != NULL) {
if (gparent->left_son == parent)
gparent->left_son = this;
else
gparent->right_son = this;
}
parent = gparent;
}
...
}

Mai 2015

25

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
void push_up() {
while (parent != NULL) {
if (prio > parent->prio) {
TreapNode<T>* gparent = parent->parent;
if (parent->left_son == this) {
rotate_right();
} else {
rotate_left();
}
} else
break;
}
}
...
}

Mai 2015

26

STRUCTURI DE DATE CURSUL 11 - Treap

Treap exemplu inserare

Mai 2015

27

STRUCTURI DE DATE CURSUL 11 - Treap

Treap exemplu inserare

Mai 2015

28

STRUCTURI DE DATE CURSUL 11 - Treap

Treap exemplu inserare

Mai 2015

29

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
void remove_self() {
TreapNode<T> *p;
if (left_son == NULL && right_son == NULL) {
if (parent == NULL) { // this == root
delete this;
} else {
if (parent->left_son == this)
parent->left_son = NULL;
else
parent->right_son = NULL;
delete this;
}
} else {
. . . // vezi pagina urmatoare
}
}
...
}

Mai 2015

30

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
// Intoarce 1 daca e stearsa radacina arborelui si 0 altfel.
int remove_self() {
. . .
} else {
if (left_son != NULL) {
// Gaseste nodul cu cea mai mare val din subarb stang.
p = left_son;
while (p->right_son != NULL)
p = p->right_son;
} else { // right_son != NULL
// Gaseste nodul cu cea mai mica val din subarb drept.
p = right_son;
while (p->left_son != NULL)
p = p->left_son;
}
memcpy(&info, &(p->info), sizeof(T));
p->remove_self();
// si putem sa ne oprim aici sau...
}
}
...
}

Mai 2015

31

STRUCTURI DE DATE CURSUL 11 - Treap

Treap
template<typename T> class TreapNode {
...
// Intoarce 1 daca e stearsa radacina arborelui si 0 altfel.
int remove_self() {
. . .
} else {
if (left_son != NULL) {
// Gaseste nodul cu cea mai mare val din subarb stang.
p = left_son;
while (p->right_son != NULL)
p = p->right_son;
} else { // right_son != NULL
// Gaseste nodul cu cea mai mica val din subarb drept.
p = right_son;
while (p->left_son != NULL)
p = p->left_son;
}
swap_with(p);
p->remove_self();
push_down();
}
}
...
}

Mai 2015

32

STRUCTURI DE DATE CURSUL 11 - Treap

Treap

template<typename T> class TreapNode {


...
void push_down() {
while (left_son!=NULL || right_son!=NULL) {
// rotim in directia fiului cu prioritate mai mare
// pt ca avem un max-heap
if (left_son==NULL || left_son.prio < right_son.prio)
right_son->rotate_left();
else
left_son->rotate_right();
}
...
}

Mai 2015

33

STRUCTURI DE DATE CURSUL 11 - Treap

Treap exemplu stergere

Mai 2015

34

STRUCTURI DE DATE CURSUL 11 - Treap

Treap exemplu stergere

Mai 2015

35

STRUCTURI DE DATE CURSUL 11 - Treap

Treap exemplu stergere

Mai 2015

36

STRUCTURI DE DATE CURSUL 11 - Treap

Treap

template<typename T> class TreapNode {


...
int remove_info(T x) {
TreapNode<T> *t = find_info(x);
if (t != NULL)
return t->remove_self();
else
return 0;
}
...
}

Mai 2015

37

STRUCTURI DE DATE CURSUL 11 - Treap

Analiza
Existe :
O rotaie e i e proprietatea de BST, se folosete pentru
respectarea celei de heap

Unicitate:
Nodul cu prioritatea cea mai mare va fi rada i
mparte n mod unic (dup invariantul de BST) n doi
subarbori
Se apli recursiv

Mai 2015

38

STRUCTURI DE DATE CURSUL 11 - Treap

Complexitate
Datorit alegerii random a prioritilor, inserarea i
stergerea au loc in O(logN), N u rul de noduri
din arbore
Nu rul ateptat de rotaii ntr-o inserare este O(1)
De o straie:
Depeste scopul cursului :)
Dar se poate gsi la
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/scandal/p
ublic/papers/treaps-spaa98.pdf

Mai 2015

39

STRUCTURI DE DATE CURSUL 11 - Treap

Reading material
1. http://www.cs.cmu.edu/afs/cs.cmu.edu/project/scandal/pub
lic/papers/treaps-spaa98.pdf
2. http://compgeom.cs.uiuc.edu/~jeffe/teaching/algorithms/no
tes/10-treaps.pdf
3. http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/154
51-s07/www/lecture_notes/lect0208.pdf

Mai 2015

40

STRUCTURI DE DATE CURSUL 11 - Treap

Alte posibile operatii

Mai 2015

Gsire element cheie minima


Gsire element cheie axi
Gsirea celei de-a k-a cheie, n ordine sortat
Split
Join

41

STRUCTURI DE DATE CURSUL 11 - Treap

Takeaway

Mai 2015

Recapitulare Heap
Recapitulare BST
Rotatii si echilibrare
Treap
- Definitie
- Operatii
- Implementare
- Analiza
- Complexitate

42

S-ar putea să vă placă și