Hogyan lehetne javítani a hatékonyságot a funkció, amely megkeresi a tételek száma a tartományban AVL-fa?

szavazat
0

Írok egy függvényt, amely megtudja az összes elem egy AVL fát tartományban. Például az érvek, hogy telt el az „AB” és „au”, akkor azt kell kideríteni, hogy hány elem azok egy AVL fa ebben a tartományban.

Jelenleg a módja ennek az, hogy áthalad a fa minden egyes alkalommal, amikor az ügyfél kéri azt. De mivel a tételek számát az én AVL fa változik nagy, tart örökké, ha az ügyfél kéri, ez a funkció túl sokszor. Van egy gyorsabb módja, hogy?

Saját tartomány funkció:

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);
}
A kérdést 13/02/2020 23:59
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
1

A jelenlegi algoritmus komplexitása O (M + log n) ahol N a méret a fa és M jelentése a elemek száma tartományon belül . Nem hiszem, hogy meg lehet csinálni bármilyen jobb feljavítatlan AVL fa. Tehát a megoldás arra, hogy megváltoztassa a fát végrehajtását.

Egy egyszerű módja, hogy az, hogy tárolja az egyes csomópontok a méret a részfa abban csomóponton. Ez az információ lehet frissíteni állandó ideje alatt fa forgatást. Később lehet, hogy kihagyja teljes részfákat az alábbiak szerint:

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

Ez adna egy O (log N) összetettsége.

NYILATKOZAT: a kód nem tesztelt.

Válaszolt 14/02/2020 00:38
a forrás felhasználó

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