Treap / Structuri de date

42
Structuri de Date Treap [email protected] Universitatea Politehnica Bucureşti Do you see the young lady? or the old lady?

description

Structura de date Treap / Binary Search Tree + Heap / Pentru un arbore BST mai echilibrat

Transcript of Treap / Structuri de date

  • Structuri de Date Treap [email protected]

    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

    +