Hvordan å forbedre effektiviteten av funksjonen som finner antallet elementer i et område fra AVL treet?

stemmer
0

Jeg skriver en funksjon som finner ut det totale antall elementer i en AVL tre av serien. For eksempel, de argumenter som sendes inn er ab og au, så jeg må finne ut hvor mange elementer de er i en AVL treet er i dette området.

Tiden min måte å gjøre dette på er å traversere treet hver gang når klienten kaller det. Men fordi antallet elementer i mine AVL treet er varierer stort, tar det alltid hvis klienten kaller denne funksjonen for mange ganger. Er det en raskere måte å gjøre det?

Min range funksjon:

void range(AvlTree T, char* k1, char* k2) {
    if ( T == NULL )
        return;

    if ( strcmp(k1, T->Element) < 0 )
        range(T->Left, k1, k2);

    if ( strcmp(k1, T->Element) <= 0 && strcmp(k2, T->Element) >= 0 )
        total++;

    if ( strcmp(k2, T->Element) > 0 )
        range(T->Right, k1, k2);
}
Publisert på 13/02/2020 klokken 21:59
kilden bruker
På andre språk...                            


1 svar

stemmer
1

Den gjeldende algoritme har en kompleksitet O (M + log N) , hvor N er størrelsen av treet mens M er antall elementer innenfor området . Jeg tror ikke at du kan gjøre noe bedre med unaugmented AVL treet. Så løsningen vil innebære endring av treet gjennomføring.

En grei måte å gjøre det på er å lagre i hver node størrelsen på undertreet på den noden. Denne informasjonen kan bli oppdatert i konstant tid under treet rotasjon. Senere kan den brukes til å hoppe over hele undertrær som følger:

int range(AvlTree T, const char* k1, const char* k2) {
    assert(!k1 || !k2 || strcmp(k1, k2) <= 0);
    if(T == NULL)
        return 0;
    if(!k1 && !k2)
        return T->size;
    if(k2 && strcmp(k2, T->Element) < 0)
        return range(T->left, k1, k2);
    if(k1 && strcmp(T->Element, k1) < 0)
        return range(T->right, k1, k2);
    return range(T->left, k1, 0) + 1 + range(T->right, 0, k2);
}

Dette ville gi en O (log N) kompleksitet.

FORBEHOLD: koden er uprøvd.

Svarte 13/02/2020 kl. 22:38
kilden bruker

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