Documente Academic
Documente Profesional
Documente Cultură
Politehnica
Bucureti
Exercitii Heap
Mai 2015
Exercitii Heap
Mai 2015
Exercitii Heap
Mai 2015
Exercitii Heap
Mai 2015
Exercitii Heap
Mai 2015
Exercitii Heap
Mai 2015
Exercitii Heap
i-1
floor(i/2)
ceil(i/2)
(i+1)/2
Mai 2015
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
Aplicatii
Mai 2015
10
Probleme BST
Comportament bun pe chei random, dar prost pe input
particular
Exemplu: chei sortate
Mai 2015
11
Probleme BST
Mai 2015
12
Cum rezolv ?
Facem rotaii n arbore ( ei proprietatea de arbore de
utare)
Mai 2015
13
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
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
Echilibrare
Mai 2015
16
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
Treap
Operatii Treap:
cautare
inserare
stergere
Mai 2015
18
Treap
template<typename T> class TreapNode {
public:
TreapNode<T> *left_son, *right_son, *parent;
int prio;
...
}
Mai 2015
19
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
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
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
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
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
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
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
Mai 2015
27
Mai 2015
28
Mai 2015
29
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
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
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
Treap
Mai 2015
33
Mai 2015
34
Mai 2015
35
Mai 2015
36
Treap
Mai 2015
37
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
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
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
Mai 2015
41
Takeaway
Mai 2015
Recapitulare Heap
Recapitulare BST
Rotatii si echilibrare
Treap
- Definitie
- Operatii
- Implementare
- Analiza
- Complexitate
42