Jak poprawić efektywność funkcji, która znajdzie liczbę elementów w zakresie od Drzewo AVL?

głosy
0

Piszę funkcję, która dowiaduje się, w ogólnej liczbie elementów w Drzewo AVL według asortymentu. Na przykład, argumenty, które przeszły w jest „AB” i „AU”, to muszę się dowiedzieć, jak wiele elementów są w drzewie AVL jest w tym zakresie.

Obecnie mój sposób postępowania jest przechodzenie drzewa za każdym razem, gdy klient zwraca go. Ale ponieważ liczba elementów w moich AVL drzewo zmieniać duży, trwa na wieki, jeśli klient zwraca ta funkcja zbyt wiele razy. Czy istnieje szybszy sposób to zrobić?

Mój zakres funkcji:

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);
}
Utwórz 13/02/2020 o 21:59
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Twój obecny algorytm ma złożoność O (M + log N) , gdzie N jest wielkość drzewa i M jest liczbą elementów w całym zakresie . Nie sądzę, że można to zrobić lepiej z unaugmented drzewie AVL. Więc rozwiązanie wiązałoby zmianę implementacji drzewa.

Prosty sposób na to jest do przechowywania w każdym węźle rozmiar poddrzewa w danym węźle. Informacje te mogą być aktualizowane w czasie stałym podczas obracania drzewa. Później może być używany, aby przejść całe sub-drzew, co następuje:

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

To dałoby O (log N) złożoności.

OŚWIADCZENIE: kod jest niesprawdzone.

Odpowiedział 13/02/2020 o 22:38
źródło użytkownik

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