Cum de a găsi rangul de un nod într-un arbore AVL?

voturi
4

Am nevoie să pună în aplicare două interogări de rang [ rank(k)i select(r)]. Dar , înainte de a putea începe acest lucru, am nevoie să dau seama cum funcționează cele două funcții.

Din câte știu, se rank(k)întoarce rangul de cheie dată k, și select(r)returnează cheia unui anumit rang r.

Deci, întrebările mele sunt:

1.) Cum se calculează rangul unui nod într-un BST AVL (auto-echilibrare)?

2.) Este posibil ca mai mult de o cheie pentru a avea același rang? Și dacă da, ce woulud select(r)reveni?

Am de gând să includă un copac eșantion AVL care se poate referi la cazul în care ajută răspunde la întrebare.

introduceți

Mulțumiri!

Întrebat 28/02/2011 la 03:40
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
3

Întrebarea dvs. într-adevăr se reduce la: „cum este termenul«rang»este definit în mod normal, în raport cu un arbore AVL?“ (Și, eventual, cum este „selectați“ este definit în mod normal, de asemenea).

Cel puțin așa cum l-am văzut termenul folosit, „rang“ înseamnă poziția printre nodurile din copac - adică, cât de multe noduri sunt de la stânga. Ai dat de obicei, un pointer la un nod (sau, poate, o valoare-cheie) și aveți nevoie pentru a contoriza numărul de noduri din stânga acestuia.

„Select“ este de fapt opusul - esti dat un rang special, și au nevoie pentru a prelua un pointer la nodul specificat (sau tasta pentru acel nod).

Două observații: În primul rând, din moment ce nici una dintre aceste modificari copac de la toate, nu face nici o diferență reală ce formă de echilibrare este utilizat (de exemplu, AVL vs roșu / negru); pentru care contează un copac cu nici o echilibrare, la toate este echivalentă, de asemenea. În al doilea rând, în cazul în care aveți nevoie pentru a face acest lucru în mod frecvent, vă puteți îmbunătăți viteza considerabil prin adăugarea unui câmp suplimentar pentru fiecare nod de înregistrare cât de multe noduri sunt la stânga sa.

Publicat 28/02/2011 la 04:07
sursa de către utilizator

voturi
1

Locul este numărul de noduri din arborele de sub stânga, plus unul, și se calculează pentru fiecare nod. Eu cred că rangul nu este un concept specific pentru arbori AVL - aceasta poate fi calculată pentru orice arbore binar.

Selectați este chiar vizavi de rang. Un rang este dat și trebuie să se întoarcă o potrivire nod care rang.

Codul de mai jos se va efectua de calcul rang:

void InitRank(struct TreeNode *Node)
{
        if(!Node)
        {
                return;
        }
        else
        {       Node->rank = 1 + NumeberofNodeInTree(Node->LChild);
                InitRank(Node->LChild);
                InitRank(Node->RChild);
        }

}


int NumeberofNodeInTree(struct TreeNode *Node)
{
        if(!Node)
        {
                return 0;
        }
        else
        {
                  return(1+NumeberofNodeInTree(Node->LChild)+NumeberofNodeInTree(Node->RChild));
        }
}
Publicat 30/08/2013 la 10:13
sursa de către utilizator

voturi
0

Aici este codul am scris și a lucrat bine pentru AVL copac pentru a obține rangul de o anumită valoare. diferenta este doar un nod folosit ca parametru și am folosit o cheie de un parametru. puteți modifica acest lucru ca pe propriul drum. Cod simplu:

    public int rank(int data){
    return rank(data,root);
}

private int rank(int data, AVLNode r){
    int rank=1;
    while(r != null){
        if(data<r.data)
            r = r.left;
        else if(data > r.data){
            rank += 1+ countNodes(r.left);
            r = r.right;
        }
        else{
            r.rank=rank+countNodes(r.left);
            return r.rank;
        }
    }
    return 0;
}

[NB] Dacă doriți să începeți rank-ul de la 0, apoi inițializa rang variabila = 0. cu siguranta ar fi pus în aplicare countNodes metoda () pentru a executa acest cod.

Publicat 08/09/2015 la 20:14
sursa de către utilizator

voturi
-1

Iată ce am făcut. În programul meu rangul unui element este definit ca 1+ (nr de elemente mai mare decât acel element). Puteți nota aici că elementul nu trebuie să prezinte în copac.

Algoritmul pentru a găsi rang:

1.In structura copac ține evidența nr de elemente într-un copac de sub inclusiv rădăcină. Deci, șeful voinței arbore conține elemente totale în copac.

2.Compare elementul cu un nod, în cazul în care acesta este mai mic decât nodul, atunci există (1 + No.of elemente copil dreapta) elemente mai mari decât cheia element.Add-l la total și de căutare recursiv elementului din copil stânga.

3.Dacă elementul este mai mare decât nodul rădăcină și apoi caută doar elementul recursiv în copilul din dreapta. (Nu este nevoie să adăugați ceva de când neglijăm copac din stânga, în care toate elementele sunt mai mici decât cheia dată)

4.Terminate algo când găsiți elementul sunt atinse nul.

Programul dat returnează nici elemente mai mari decât cheia dată. 1+ valoarea returnată este rangul.

fragment de cod:

int AVLUtils::rank(Node *root,long long val)
  {
    int n_ele_greater=0;
    int rank =0;

    if(root == NULL)
    return 0;
   if(val < root->key)
     {
    n_ele_greater = 1+this->n_elements(root->right_child)+this->rank(root->left_child,val);
     }
   else if(val > root->key)
     {
    n_ele_greater=this->rank(root->right_child,val);
    }

    else if(val == root->key)
    {
    return(this->n_elements(root->right_child));
    }
    return(n_ele_greater);
   }

Sper că acest lucru vă ajută :)

Publicat 03/10/2015 la 16:52
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more