Jak zlepšit účinnost funkce, která najde počet položek v rozmezí od AVL stromu?

hlasů
0

Píšu funkci, která zjistí, že celkový počet položek v AVL stromu rozsahu. Například argumenty, které prošly v je „AB“ a „au“, pak musím zjistit, kolik položek, které jsou v AVL stromu je v tomto rozsahu.

V současné době můj způsob, jak toho dosáhnout, je projít stromu pokaždé, když ho klient volá. Ale proto, že počet kusů mých AVL strom měnit velké, to trvá věčně, pokud klient volání této funkce příliš mnohokrát. Existuje rychlejší způsob, jak to udělat?

Můj rozsah funkcí:

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);
}
Položena 13/02/2020 v 23:59
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Vaše aktuální algoritmus má složitost O (M + log N) , kde N je velikost stromu a M je počet prvků v rozsahu . Nemyslím si, že můžete dělat lépe s Bezforsážní AVL stromu. Takže řešení by vyžadovalo změnu implementaci stromu.

Jednoduchý způsob, jak to udělat, je uložit do každého uzlu velikost podstromu v tomto uzlu. Tuto informaci lze během rotace stromu aktualizován v konstantním čase. Později jej lze použít pro přeskočení celé dílčí stromy takto:

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 by je O (log n) složitost.

OMEZENÍ: kód je nevyzkoušený.

Odpovězeno 14/02/2020 v 00:38
zdroj uživatelem

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