Hvordan finne rangeringen av en node i et AVL treet?

stemmer
4

Jeg trenger å implementere to rang spørsmål [ rank(k)og select(r)]. Men før jeg kan begynne på dette, må jeg finne ut hvordan de to funksjonene fungerer.

Så vidt jeg vet, rank(k)returnerer rangeringen av et gitt nøkkel k, og select(r)returnerer nøkkelen til en gitt rang r.

Så mitt spørsmål er:

1.) Hvordan regner dere rang av en node i et AVL (selvbalanserende BST)?

2.) Er det mulig for mer enn én tast for å ha samme verdi? Og hvis så, hva woulud select(r)tilbake?

Jeg kommer til å inkludere en prøve AVL tre som du kan se om det hjelper å svare på spørsmålet.

skriv

Takk!

Publisert på 28/02/2011 klokken 02:40
kilden bruker
På andre språk...                            


4 svar

stemmer
3

Ditt spørsmål egentlig koker ned til: "hvordan er begrepet 'rang' normalt definert med hensyn til en AVL treet?" (Og, eventuelt, hvor er 'velg' normalt definert i tillegg).

Minst som jeg har sett betegnelsen "rang" betyr posisjonen blant nodene i treet - dvs. hvor mange noder er til venstre. Du er vanligvis gitt en peker til en node (eller kanskje en nøkkelverdi), og du trenger å telle antall noder til sin venstre.

"Velg" er i utgangspunktet det motsatte - du får en spesiell rang, og trenger å hente en peker til den oppgitte noden (eller nøkkelen for at node).

To merknader: Først, siden ingen av disse modifiserer den tre i det hele tatt, gjør det ingen reell forskjell hvilken form for balansering brukes (f.eks AVL vs. rød / svart); for den saks skyld et tre uten balansering i det hele tatt er det samme også. For det andre, hvis du trenger å gjøre dette ofte, kan du forbedre hastigheten betraktelig ved å legge til et ekstra felt til hver node opptak hvor mange noder er til sin venstre.

Svarte 28/02/2011 kl. 03:07
kilden bruker

stemmer
1

Rank er antall noder i venstre undertreet pluss én, og er beregnet for hver node. Jeg tror rang er ikke et konsept som er spesifikk for AVL trær - det kan beregnes for et hvilket som helst binært tre.

Velg er bare overfor rangere. En rang er gitt, og du må returnere en node matching som rang.

Følgende kode vil utføre rang beregning:

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));
        }
}
Svarte 30/08/2013 kl. 09:13
kilden bruker

stemmer
0

Her er koden jeg skrev og fungerte fint for AVL treet for å få rangeringen av en bestemt verdi. Forskjellen er bare at du brukte en node som parameter og jeg brukte en nøkkel en parameter. du kan endre dette som din egen måte. Eksempelkode:

    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] Hvis du ønsker å starte din rang fra 0 da initial variabel rang = 0. du definitivt bør ha gjennomført metode countNodes () for å utføre denne koden.

Svarte 08/09/2015 kl. 20:14
kilden bruker

stemmer
-1

Her er hva jeg har gjort. I min program rang av et element er definert som den 1+ (ingen av elementene er større enn det element). Du kan merke seg her at elementet ikke behøver presentere i treet.

Algoritme for å finne rang:

1.In trestrukturen holde orden på noen av elementene i en sub tre inkludert roten. Så hodet av treet vilje inneholder totalt elementer i treet.

2.Compare elementet med en node, hvis det er mindre enn den node, så er (1 + No.of tickets elementer i rett barn) elementer er større enn styrings element.Add det til den totale og rekursivt søke elementet i venstre barn.

3. Hvis elementet er større enn rotnoden så bare søke elementet rekursivt i riktig barn. (Ikke nødvendig å legge til noe siden vi neglisjere venstre treet, hvor alle elementene er mindre enn den gitte nøkkelen)

4.Terminate algo når du finner elementet er nådd null.

Den oppgitte programmet ikke returnerer elementer større enn den gitte nøkkelen. 1+ den returnerte verdien er rang.

kodebiten:

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);
   }

Håper dette hjelper :)

Svarte 03/10/2015 kl. 16:52
kilden bruker

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