Wie die Effizienz der Funktion zu verbessern, dass die Anzahl der Elemente in einem Bereich von AVL-Baum findet?

stimmen
0

Ich schreibe eine Funktion, die Funde aus der Gesamtzahl der Elemente in einem AVL-Baum durch Bereich. die Argumente zum Beispiel, die in ist „ab“ und „au“ übergeben, dann muss ich herausfinden, wie viele Gegenstände, die sie in einem AVL-Baum sind in diesem Bereich ist.

Derzeit ist mein Weg, dies zu tun, ist der Baum jedes Mal zu durchlaufen, wenn der Client es nennt. Aber da die Anzahl der Einzelteile in meinem AVL-Baum ist groß variieren, es dauert ewig, wenn der Kunde diese Funktion zu oft aufruft. Gibt es einen schnelleren Weg, dies zu tun?

Meine Range-Funktion:

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);
}
Veröffentlicht am 13/02/2020 um 21:59
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Ihre aktuelle Algorithmus hat eine Komplexität von O (log M + N) , wobei N die Größe des Baumes ist und M die Anzahl der Elemente innerhalb des Bereichs . Ich glaube nicht , dass man besser mit unaugmented AVL - Baum zu tun. So wäre die Lösung einbeziehen Ihre Baum - Implementierung zu verändern.

Eine einfache Art und Weise zu tun, die an diesem Knoten in jedem Knoten, um die Größe des Unterbaums zu speichern. Diese Information kann in konstanter Zeit während Baum Rotation aktualisiert werden. Später kann es verwendet werden ganze Teilbäume zu überspringen, wie folgt:

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

Dies würde einen geben O (log N) Komplexität.

HAFTUNGSAUSSCHLUSS: der Code ist nicht getestet.

Beantwortet am 13/02/2020 um 22:38
quelle vom benutzer

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