Comment améliorer l'efficacité de la fonction qui trouve le nombre d'éléments dans une gamme d'arbre AVL?

voix
0

J'écris une fonction qui trouve le nombre total d'éléments dans un arbre AVL par plage. Par exemple, les arguments transmis est « ab » et « au », alors je dois savoir combien d'articles ils sont dans un arbre AVL est dans cette gamme.

À l'heure actuelle ma façon de le faire est de traverser l'arbre chaque fois que le client appelle. Mais parce que le nombre d'éléments dans mon arbre AVL varient grand, il faut toujours si le client appelle cette fonction trop de fois. Y at-il un moyen plus rapide de le faire?

Ma fonction gamme:

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);
}
Créé 13/02/2020 à 23:59
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Votre algorithme actuel a une complexité de O (M + log N) où N est la taille de l'arbre et M est le nombre d'éléments dans la plage . Je ne pense pas que vous pouvez faire mieux avec l' arbre unaugmented AVL. Ainsi , la solution consisterait à changer votre mise en œuvre de l' arbre.

Une façon simple de le faire est de stocker dans chaque nœud la taille de la sous-arborescence à ce noeud. Ces informations peuvent être mises à jour en temps constant lors de la rotation de l'arbre. Plus tard, il peut être utilisé pour sauter sous-arbres entiers comme suit:

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

Cela donnerait une O (log N) complexité.

AVERTISSEMENT: le code est non testé.

Créé 14/02/2020 à 00:38
source utilisateur

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