Hoe om de efficiëntie van de functie die het aantal items vindt in een gebied van AVL boom te verbeteren?

stemmen
0

Ik ben het schrijven van een functie die vondsten uit het totale aantal items in een AVL boom door bereik. Bijvoorbeeld, de argumenten die doorgegeven is ab en au, dan moet ik om uit te vinden hoeveel punten ze in een AVL boom is in dat bereik.

Momenteel is mijn manier om dit te doen is om de boom te doorlopen telkens wanneer de client het noemt. Maar omdat het aantal punten in mijn AVL boom grote verschillen, duurt het een eeuwigheid als de klant deze functie te vaak noemt. Is er een snellere manier om dat te doen?

Mijn range functie:

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);
}
De vraag is gesteld op 13/02/2020 om 21:59
bron van user
In andere talen...                            


1 antwoorden

stemmen
1

Uw huidige algoritme complexiteit van O (M + log N) waarbij N de grootte van de boom en M het aantal elementen in het gebied . Ik denk niet dat je beter kunt doen met unaugmented AVL boom. Dus de oplossing zou betekenen het wijzigen van uw boom implementatie.

Een eenvoudige manier om dat te doen is op te slaan in elk knooppunt de grootte van de substructuur op dat knooppunt. Deze informatie kan in constante tijd tijdens boom rotatie worden bijgewerkt. Later kan het worden gebruikt om hele sub-bomen als volgt over te slaan:

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

Dit zou een geven O (log N) complexiteit.

DISCLAIMER: de code is niet getest.

antwoordde op 13/02/2020 om 22:38
bron van user

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