¿Cómo mejorar la eficacia de la función que se encuentra el número de elementos en un rango de árbol AVL?

votos
0

Estoy escribiendo una función que se entera de que el número total de elementos en un árbol AVL por rango. Por ejemplo, los argumentos que ha pasado es ab y au, entonces tienen que saber cuántos artículos que están en un árbol AVL es en ese intervalo.

Actualmente mi forma de hacer esto es para recorrer el árbol cada vez que el cliente lo llama. Pero debido a que el número de artículos en mi es un árbol AVL varían grande, se necesita siempre si el cliente llama a esta función demasiadas veces. ¿Hay una manera más rápida de hacer eso?

Mi función range:

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);
}
Publicado el 13/02/2020 a las 23:59
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
1

Su algoritmo actual tiene una complejidad de O (M + log N) , donde N es el tamaño del árbol y M es el número de elementos dentro de la gama . No creo que se puede hacer nada mejor con el árbol AVL no aumentada. Así que la solución implicaría cambiar su aplicación árbol.

Una forma sencilla de hacerlo es almacenar en cada nodo del tamaño del subárbol en ese nodo. Esta información puede ser actualizada en tiempo constante durante la rotación del árbol. Más tarde se puede utilizar para saltar la totalidad de los sub-árboles de la siguiente manera:

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

Esto daría una O (log N) complejidad.

Exención de responsabilidad: el código no se ha probado.

Respondida el 14/02/2020 a las 00:38
fuente por usuario

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