Diferente pentru treapuri intre reviziile #81 si #80

Nu exista diferente intre titluri.

Diferente intre continut:

** 'Ştergere':treapuri#stergere
** 'Split':treapuri#split
** 'Join':treapuri#join
* '4. Concluzii':treapuri#concluzii
* '5. Aplicaţii':treapuri#aplicatii
* '6. Bibliografie':treapuri#bibliografie
* '4. Implementare':treapuri#cod
În acest articol voi prezenta o alternativă pentru arborii binari de căutare echilibraţi, precum $AVL$, $Red-Black Trees$, $Splay Trees$ şi $B-Trees$.
Costul operaţiilor de mai jos este proporţional cu adâncimea unui nod din treap. După cum am menţionat mai sus, cu ajutorul teoriei probabilităţilor se poate deduce că adâncimea aşteptată a oricărui nod este $O(log N)$, ceea ce implică costul celor mai lente operaţii să fie $O(log N)$.
Mai jos avem definiţia în cod $C++$ a unui treap şi o funcţie de iniţializare, care marchează că treapul cu rădăcina $R$ este gol.
 
== code(cpp) |
struct T {
    int key;
    int priority;
    T *left, *right;
} *R, *nil;
 
void init(T* &R)
{
    srand(unsigned(time(0)));
 
    R = nil = new T();
    nil->key = nil->priority = 0,
        nil->left = nil->right = NULL;
}
==
 
h3(#cautare). Căutare
Căutarea într-un treap este identică cu cea într-un arbore binar de căutare. Pentru a verifica dacă o cheie există putem proceda în felul următor:
Complexitate: $O(log N)$.
h2(#concluzii). Concluzii
h2(#cod). Implementare
 
Mai jos este codul în $C++$ pentru unele operaţii prezentate anterior. Puteţi face o comparaţie între funcţiile $erase$ sau $balance$ din articolul următor despre arborii '$AVL$':multe-smenuri-de-programare-in-cc-si-nu-numai#AVL şi cele ale treapurilor.
 
== code(cpp) |
 
struct T {
    int key;
    int priority;
    T *left, *right;
} *R, *nil;
 
void init(T* &R)
{
    srand(unsigned(time(0)));
 
    R = nil = new T();
    nil->key = nil->priority = 0,
        nil->left = nil->right = NULL;
}
 
void rotleft(T* &n)
{
    T *t = n->left;
    n->left = t->right, t->right = n;
    n = t;
}
 
void rotright(T* &n)
{
    T *t = n->right;
    n->right = t->left, t->left = n;
    n = t;
}
 
void balance(T* &n)
{
    if (n->left->priority > n->priority)
        rotleft(n);
    else if (n->right->priority > n->priority)
        rotright(n);
}
 
void insert(T* &n, int key)
{
    if (n == nil)
    {
        n = new T();
        n->key = key, n->priority = rand() + 1,
                    n->left = n->right = nil;
        return;
    }
    if (key < n->key)
        insert(n->left, key);
    else if (key > n->key)
        insert(n->right, key);
Mai sus aţi văzut codul în $C++$ pentru cele mai importante operaţii. Puteţi face o comparaţie între funcţiile $erase$ sau $balance$ din articolul următor despre arborii '$AVL$':multe-smenuri-de-programare-in-cc-si-nu-numai#AVL şi cele ale treapurilor.
    balance(n);
}
h2(#aplicatii). Aplicaţii
void erase(T* &n, int key)
{
    if (n == nil)   return ;
h2(#bibliografie). Bibliografie
    if (key < n->key)
        erase(n->left, key);
    else if (key > n->key)
        erase(n->right, key);
    else {
        (n->left->priority > n->right->priority) ? rotleft(n) : rotright(n);
        if (n != nil)
            erase(n, key);
        else {
            delete n->left;
            n->left = NULL;
        }
    }
}
==

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.