View
231
Download
2
Category
Tags:
Preview:
DESCRIPTION
Structura de date Treap / Binary Search Tree + Heap / Pentru un arbore BST mai echilibrat
Citation preview
Structuri de Date Treap alexandru.olteanu@cs.pub.ro
Universitatea
Politehnica
Bucureti
Do you see the young lady? or the old lady?
Exercitii Heap
2 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Care dintre acestea este un Max-Heap?
Exercitii Heap
3 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Creati un Heap pe baza acestor chei: 10, 12, 1, 14, 8, 6, 5
Exercitii Heap
4 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Eliminati cheia 14 din Heap-ul obtinut in exercitiul precedent
Exercitii Heap
5 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Scrieti o functie care verifica un Heap daca este organizat corect
Exercitii Heap
6 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
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
Exercitii Heap
7 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Cum va arata vectorul de la exercitiul precedent dupa doua operatii pop?
Exercitii Heap
8 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
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) i-1 b) floor(i/2) c) ceil(i/2) d) (i+1)/2
Daca array-yl ar fi folosit incepand cu pozitia 0, care ar fi raspunsul?
Recapitulare BST
9 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
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)
Aplicatii
10 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Scheduler-ul de Linux kernel folosete arbore rou-negru Jocuri video obiecte din plan care trebuie inserate, terse i
gsite
Probleme BST
11 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Comportament bun pe chei random, dar prost pe input particular
Exemplu: chei sortate
Probleme BST
12 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Standard Template Library nu ajut ntotdeauna Dei exist set, multiset, priority_queue, nu pot oie a k-a
cheie dintr-o ulie de chei
Cum rezolv?
13 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Facem rotaii n arbore (ei proprietatea de arbore de utare)
Cum rezolv?
14 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Rotaie dreapta: Z->left = B; W->right = Z
Rotaie stnga: W->right = B; Z->left = W;
n prati: valori auxiliare pentru interschimbare grij la prite noduri nil pentru nodurile care nu au 2 fii
Echilibrare
15 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Totui, cnd facem rotaiile? i vom asigna fierui 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
Echilibrare
16 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
+
Treap
17 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Un treap este un arbore binar care respet doi ivariai Invariantul arborelui de utare pentru chei (tree) Invariantul de heap pentru prioriti (heap)
=> treap
Treap
18 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Operatii Treap: cautare inserare stergere
Treap
19 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { public: TreapNode *left_son, *right_son, *parent; int prio; ... }
Treap
20 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { public: T info; TreapNode *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(); } ... }
Treap
21 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { ... TreapNode* find_info(T x) { if (compare(x, info) == 0) return this; if (compare(x, info) find_info(x); else return NULL; } else { if (right_son != NULL) return right_son->find_info(x); else return NULL; } } ... }
Treap
22 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { ... TreapNode* insert_info(T x) { int next_son; TreapNode* result; if (compare(x, info)
Treap
23 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { ... TreapNode* insert_info(T x) { ... if (next_son == 0) { // left son if (left_son == NULL) { left_son = new TreapNode(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(compare, x); right_son->parent = this; right_son->push_up(); result = right_son; } else result = right_son->insert_info(x); } return result; } ... }
Treap
24 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { ... void rotate_right() { TreapNode* gparent = parent->parent; TreapNode* 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; } ... }
Treap
25 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { ... void rotate_left() { TreapNode* gparent = parent->parent; TreapNode *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; } ... }
Treap
26 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { ... void push_up() { while (parent != NULL) { if (prio > parent->prio) { TreapNode* gparent = parent->parent; if (parent->left_son == this) { rotate_right(); } else { rotate_left(); } } else break; } } ... }
Treap exemplu inserare
27 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Treap exemplu inserare
28 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Treap exemplu inserare
29 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Treap
30 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { ... void remove_self() { TreapNode *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 } } ... }
Treap
31 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template 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... } } ... }
Treap
32 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template 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(); } } ... }
Treap
33 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template 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(); } ... }
Treap exemplu stergere
34 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Treap exemplu stergere
35 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Treap exemplu stergere
36 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Treap
37 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
template class TreapNode { ... int remove_info(T x) { TreapNode *t = find_info(x); if (t != NULL) return t->remove_self(); else return 0; } ... }
Analiza
38 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Existe: O rotaie eie proprietatea de BST, se folosete pentru
respectarea celei de heap
Unicitate: Nodul cu prioritatea cea mai mare va fi radai mparte n mod unic (dup invariantul de BST) n doi
subarbori
Se apli recursiv
Complexitate
39 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Datorit alegerii random a prioritilor, inserarea i stergerea au loc in O(logN), N urul de noduri din arbore
Nurul ateptat de rotaii ntr-o inserare este O(1) Deostraie:
Depeste scopul cursului :) Dar se poate gsi la
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/scandal/public/papers/treaps-spaa98.pdf
Reading material
40 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
1. http://www.cs.cmu.edu/afs/cs.cmu.edu/project/scandal/public/papers/treaps-spaa98.pdf
2. http://compgeom.cs.uiuc.edu/~jeffe/teaching/algorithms/notes/10-treaps.pdf
3. http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15451-s07/www/lecture_notes/lect0208.pdf
Alte posibile operatii
41 Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
Gsire element cheie minima Gsire element cheie axi Gsirea celei de-a k-a cheie, n ordine sortat Split Join
Takeaway
42
- Recapitulare Heap - Recapitulare BST - Rotatii si echilibrare - Treap
- Definitie - Operatii - Implementare - Analiza - Complexitate
Mai 2015
STRUCTURI DE DATE CURSUL 11 - Treap
+
Recommended